codeforces 1200E Compress Words

最长公共前后缀

在拼接字符串的时候要注意要考虑主串与子串的大小,其中子串在前主串在后,如果说子串的长度为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;
}
原文地址:https://www.cnblogs.com/Accepting/p/11844877.html