把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

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]);
}
posted @ 2021-02-03 07:55  275307894a  阅读(58)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end