luogu P4824 [USACO15FEB]Censoring S
题面传送门
题目这个删掉后重新接成字符串很难处理,所以考虑用栈来衔接。
那么可以记录前一个匹配到哪里,然后就可以继续匹配。
时间复杂度\(O(n+m)\)
代码实现:
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,x,y,z,net[1000039],f[1000039],sh;
char a[1000039],b[1000039],st[1000039];
int main(){
freopen("1.in","r",stdin);
register int i,j=0;
scanf("%s",a+1);scanf("%s",b+1);
n=strlen(a+1);m=strlen(b+1);
for(i=2;i<=m;i++){
while(j&&b[j+1]!=b[i]) j=net[j];
if(b[j+1]==b[i])j++;
net[i]=j;
}
for(i=1;i<=n;i++){
st[++sh]=a[i];j=f[sh-1];
while(j&&a[i]!=b[j+1])j=net[j];
if(a[i]==b[j+1]) j++;
f[sh]=j;
if(j==m){
for(j=sh-m+1;j<=sh;j++) f[j]=st[j]=0;
sh-=m;
}
}
for(i=1;i<=sh;i++) putchar(st[i]);
}

浙公网安备 33010602011771号