版权声明:转载记得声明噢! 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;
}