题意:
给你N个由大小写字母,数字组成的字符串,让你依次合并这些字符串。
例如:S = “sample” ,T = “please” 则合并和为"samplease"
题解:
KMP
设我们已经将前面 i i i个串合并后的字符串为 S S S,第 i + 1 i+1 i+1个串为 T T T
我们只需要预处理出 T T T的 n e x t next next数组,让 S S S的后 l e n ( T ) len(T) len(T)位去匹配 T T T,然后把后面没有匹配到的合并到 S S S然后重复操作即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+50;
const int INF = 0x3f3f3f3f;
char s[MAXN],t[MAXN];
int nxt[MAXN];
int main(){
int n; scanf("%d%s",&n,s+1);
int len = strlen(s+1);
for(int i=2;i<=n;i++){
scanf("%s",t+1);
int m = strlen(t+1);
nxt[0]=nxt[1]=0;
int j = 0;
for(int i=2;i<=m;i++){
while(j && t[i]!=t[j+1]) j=nxt[j];
if(t[i]==t[j+1]) ++j;
nxt[i]=j;
}
j = 0;
for(int i=max(len-m+1,1);i<=len;i++){
while(j && s[i]!=t[j+1]) j=nxt[j];
if(s[i]==t[j+1]) ++j;
}
while((++j)<=m) s[++len]=t[j];
}
printf("%s\n",s+1);
return 0;
}