题目:
题解:
运用kmp,以便快速找到这一位可以匹配到的最长的j的位置(继承上一次的j),如果接到一半断了的话就记录一下断掉之前可以达到的最长位置j,这样如果删除了子串就直接接到上一次的最长位置继续比价
代码:
#include <cstdio>
#include <cstring>
#define N 1000005
using namespace std;
char ss[N],tt[N],stack[N];int ls,lt,t[N],cnt,loc[N];
void kmp()
{
t[0]=-1;
for (int i=0;i<ls;i++)
{
int j=t[i];
while (j!=-1 && tt[i]!=tt[j]) j=t[j];
t[i+1]=++j;
}
}
int main()
{
scanf("%s",&ss);scanf("%s",&tt);
ls=strlen(ss);lt=strlen(tt);
kmp();int j=0;
for (int i=0;i<ls;i++)
{
while (j!=-1 && ss[i]!=tt[j]) j=t[j];
j++;
stack[++cnt]=ss[i];
loc[cnt]=j;
if (j==lt)
{
cnt-=lt;
j=loc[cnt];
}
}
for (int i=1;i<=cnt;i++) printf("%c",stack[i]);
}