题目: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 ",ans); for(int j=ans;j<len2;j++){ s1.push_back(s2[j]); } } cout<<s1; }