比较水,先求一遍T的pre数组,然后在S里暴力匹配就可以了。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 1000100
using namespace std;
char s1[maxn],s2[maxn],s[maxn];
int next[maxn],pre[maxn];
int n,m,top;
int main()
{
scanf("%s%s",s1+1,s2+1);
n=strlen(s1+1);m=strlen(s2+1);
pre[1]=0;
for (int i=2;i<=m;i++)
{
int j=pre[i-1];
while (j && s2[j+1]!=s2[i]) j=pre[j];
if (s2[j+1]==s2[i]) j++;
pre[i]=j;
}
next[0]=0;
for (int i=1;i<=n;i++)
{
s[++top]=s1[i];
int j=next[top-1];
while (j && s2[j+1]!=s[top]) j=pre[j];
if (s2[j+1]==s[top]) j++;
next[top]=j;
if (next[top]==m) top-=m;
}
for (int i=1;i<=top;i++) printf("%c",s[i]);printf("\n");
return 0;
}