题目大意:
把所有的与模式串相同的串都去掉,输出处理后的字符串。
去掉一个串后可能会产生新的串。
题目分析:
KMP
需要用栈来维护最后剩下的字符串,和每一个字符分别匹配到了模式串的哪个位置,最后输出栈里的字符。
代码如下:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
#define N 1200000
using namespace std;
char s[N],c[N];
int lens,lenc;
int fix[N],f[N],top;
char sta[N];
int main()
{
scanf("%s%s",s,c);
lens=strlen(s);lenc=strlen(c);
fix[0]=0;
for(int i=1;i<lenc;i++)
{
int j=fix[i];
while(j && c[j]!=c[i]) j=fix[j];
if(c[j]==c[i]) fix[i+1]=j+1;
else fix[i+1]=0;
}
int j=0;
for(int i=0;i<lens;i++)
{
sta[++top]=s[i];
while(j && s[i]!=c[j]) j=fix[j];
if(s[i]==c[j]) j++;
f[top]=j;
if(j==lenc) top-=lenc,j=f[top];
}
for(int i=1;i<=top;i++)
printf("%c",sta[i]);
printf("\n");
return 0;
}