最长公共前后缀
在拼接字符串的时候要注意要考虑主串与子串的大小,其中子串在前主串在后,如果说子串的长度为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; }