【题解】
我能说这是可持久化的kmp吗?(并没有此种术语)
kmp的过程中,用一个栈来存当前U串,如果匹配到了,弹出即可,然后j指针有恢复到历史的状态,这个状态可以用f数组来存。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 1000100
int n,m,top,stack[MAXN],p[MAXN],f[MAXN];
char a[MAXN],b[MAXN];
int main()
{
//freopen("cin.in","r",stdin);
//freopen("cout.out","w",stdout);
scanf("%s",a+1); scanf("%s",b+1);
n=strlen(a+1); m=strlen(b+1);
for(int i=2,j=0;i<=m;i++)
{
while(j&&b[j+1]!=b[i]) j=p[j];
if(b[j+1]==b[i]) j++;
p[i]=j;
}
for(int i=1,j=0;i<=n;i++)
{
j=f[stack[top]];
while(j&&b[j+1]!=a[i]) j=p[j];
if(b[j+1]==a[i]) j++;
if(j==m) top-=(m-1);
else stack[++top]=i,f[i]=j;
}
for(int i=1;i<=top;i++) printf("%c",a[stack[i]]);
return 0;
}