BZOJ【3942】[Usaco2015 Feb]Censoring

版权声明:转载记得声明噢! https://blog.csdn.net/Richard__Luan/article/details/82778044

Kmp
我们需要开一个栈,记录这个点匹配到主串的哪个位置和字符,如果匹配就减去主串长度
这样做显然是对的
AC Code

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char s[10000005];
char t[10000005];
int sta[10000005];
char c[10000005];
int nxt[10000005];
int o;
int main()
{
	scanf("%s%s",s,t);	
	int len1=strlen(s);
	int len2=strlen(t);
	for(int i=1;i<len2;i++)
	{
		int j=nxt[i];
		while(j&&t[i]!=t[j])j=nxt[j];
		if(t[i]==t[j])
		{
			nxt[i+1]=j+1;
		}
		else
		nxt[i+1]=0;
	}
	int j=0;
	for(int i=0;i<len1;i++)
	{
		c[++o]=s[i];
		while(j&&s[i]!=t[j])
		{
			j=nxt[j];
		}
		if(s[i]==t[j])j++;
		sta[o]=j;
		if(j==len2)
		{
		o-=len2;
		j=sta[o];	
		}
	}
	for(int i=1;i<=o;i++)
	printf("%c",c[i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Richard__Luan/article/details/82778044
今日推荐