KMP在匹配主串时如果能匹配到一个子串,就将这个子串弹掉
从该子串前一个位置继续匹配
也可以用AC自动机实现
代码如下:
#include<cstring>
#include<cstdio>
#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;
}