zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Android_AyscnTask
    Android_handler
    Android_网络操作
    Android_网络基础
    Android_Fragment
    Android_activity 生命周期
    Android-Dialog
    android_menu
    Android-约束布局
    andorid_相对布局小练习
  • 原文地址:https://www.cnblogs.com/Accepting/p/11844877.html
Copyright © 2011-2022 走看看