题目:https://codeforc.es/contest/1200/problem/E

题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉

思路:因为这个串总共加起来<=1e6 ,所以我们能接受O(n)每个字母的复杂度,我们直接遍历求出每个前缀后缀的哈希值,然后找到最长即可,唯一要注意的是因为是在cf上的题,必须要写双哈希

 

#include<bits/stdc++.h>
#define maxn  1000005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n;
ll base=23333;
string s1,s2;
int main(){
    cin>>n;
    cin>>s1;
    int flag=0; 
    for(int i=2;i<=n;i++){
        cin>>s2;
        ll len1=s1.size();
        ll len2=s2.size();
        ll cnt=1;
        ll h1=0,h2=0;
        ll ans=0;
        for(int j=0;j<min(len1,len2);j++){
            h1=(h1*base+s1[len1-j-1])%mod;
            h2=(h2+s2[j]*cnt)%mod;
            cnt=(cnt*base)%mod;
            if(h1==h2){
                ans=j+1;    
            } 
        }
        //printf("ans=%lld\n",ans);
        for(int j=ans;j<len2;j++){
            s1.push_back(s2[j]);
        } 
    }
    cout<<s1;
}