最长公共前后缀
在拼接字符串的时候要注意要考虑主串与子串的大小,其中子串在前主串在后,如果说子串的长度为X1,主串的长度为X2 ,加入x1<x2 那么将子串与主串的后x1位连接,否则将子串的前X2为与主串的连接
然后求前缀数组。
AC代码
//最长公共前后缀
#include<bits/stdc++.h>
using namespace std;
const int N=1E6+7;
int nxt[N];
void getnxt(string s,int x){
int i=0,j=-1;
nxt[0]=-1;
while(i<x){
if(j==-1||s[i]==s[j]){
i++;
j++;
nxt[i]=j;
}
else j=nxt[j];
}
}
int main(){
ios::sync_with_stdio(0);
int n;
cin>>n;
string ans="",x,s;
for(int i=1;i<=n;i++){
cin>>x;
if(i==1){
ans+=x;
continue ;
}
s="";
int x1=ans.size();
int x2=x.size();
int c;
if(x1>x2){
s+=x;
s+="#";
for(int i=x1-x2;i<x1;i++) s+=ans[i];
getnxt(s,2*x2+1);
c=2*x2+1;
}
else {
for(int i=0;i<x1;i++) s+=x[i];
s+="#";
s+=ans;
getnxt(s,2*x1+1);
c=2*x1+1;
}
int t=nxt[c];
t=min(t,min(x1,x2));//取最小的
for(int i=t;i<x2;i++) {
ans+=x[i];
}
}
cout<<ans<<endl;
return 0;
}