看见这个题很容易想到kmp,只要匹配到模式串就删除,然后连上前面的继续匹配。
接下来要处理的问题就是删除完一段后如何继续匹配,并且如何输出。
会发现后进的先出,很容易想到栈。成功匹配就从栈顶弹出,开一个数组记录文本串中第个字符所对应的是多少。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int lena,lenb,nxt[N],f[N],stk[N],top;
char a[N],b[N];
int main(){
ios::sync_with_stdio(false);
cin>>(a+1)>>(b+1);
lena=strlen(a+1),lenb=strlen(b+1);
for(int i=2,j=0;i<=lenb;i++){
while(j&&b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) j++;
nxt[i]=j;
}
for(int i=1,j=0;i<=lena;i++){
while(j&&a[i]!=b[j+1]) j=nxt[j];
if(a[i]==b[j+1]) j++;
f[i]=j,stk[++top]=i;
if(j==lenb) top-=lenb,j=f[stk[top]];
}
for(int i=1;i<=top;i++) cout<<a[stk[i]];
return 0;
}