题解:
虽然随便一想就知道用已经拼接好的作为文本串,待拼接的做模式串。KMP走到最后把剩下的补上。
但复杂度炸了,冷静分析,发现只用匹配文本串后len2个就行。于是就愉快地切掉了。。。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n;
char s[N],t[N],fw[N];
int l1,l2,f[N];
int main()
{
scanf("%d",&n);n--;
scanf("%s",s+1);l1=strlen(s+1);
while(n--)
{
scanf("%s",t+1);l2=strlen(t+1);
for(int i=1;i<=l2;i++)f[i]=0;
int j=0;
for(int i=2;i<=l2;i++)
{
while(j&&t[i]!=t[j+1])j=f[j];
if(t[i]==t[j+1])j++;
f[i]=j;
}
j=0;
for(int i=l1-l2+1;i<=l1;i++)
{
while(j&&s[i]!=t[j+1])j=f[j];
if(s[i]==t[j+1])j++;
if(l2==j&&i!=l1)j=f[j];
}
for(int i=j+1;i<=l2;i++)s[++l1]=t[i];
}
for(int i=1;i<=l1;i++)printf("%c",s[i]);
}