BZOJ[3942][Usaco2015 Feb]Censoring(Silver) KMP

传送门ber~

KMP在匹配主串时如果能匹配到一个子串,就将这个子串弹掉
从该子串前一个位置继续匹配

也可以用AC自动机实现

代码如下:

#include
#include
#define N 1000050
using namespace std;
char c[N],str[N],s[N];
int pos[N],nex[N],top;
inline void GetNext(){
    int i=1,j=0,len=strlen(str+1);
    nex[1]=0;
    while(i<=len){
        if(!j || str[i]==str[j])
            nex[++i]=++j;
        else j=nex[j];
    }
}
inline void KMP(){
    int i=1,j=1,len=strlen(str+1),len1=strlen(c+1);
    while(i<=len1){
        if(!j || c[i]==str[j]){
            s[++top]=c[i];
            pos[top]=j;
            if(j==len){
                top-=len;
                j=pos[top];
            }
            ++i,++j;
        }
        else j=nex[j];
    }
}
int main(){
    scanf("%s%s",c+1,str+1);
    GetNext();
    KMP();
    for(int i=1;i<=top;i++)
        printf("%c",s[i]);
return 0;
}

你可能感兴趣的:(BZOJ,KMP)