cf之kmp匹配稍稍改一改
看样例就知道要干嘛了
http://codeforces.com/contest/1200/problem/E
每次我们用新的串和答案串匹配,答案串的匹配位置是max(0,(int)ans.size()-(int)s.size()),这样可以降低时间复杂度。答案串是S,新串是T。
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=1000000+66; const ll mod=1e9+7; int n; string s[maxn]; string ans; int nexts[maxn]; void getnexts(string t) { int len=t.size(); int i=0; int j=-1; nexts[0]=-1; while(i<len) { if(j==-1||t[i]==t[j]) { i++; ++j; if(t[i]!=t[j]) nexts[i]=j; else nexts[i]=nexts[j]; } else { j=nexts[j]; } } } int kmp(string &s,string &t,int pos)//s是答案串 { int i=pos;// int j=0; int sl=s.size(); int tl=t.size(); while(i<sl) { if(j==-1||s[i]==t[j]) { ++i; ++j; } else { j=nexts[j]; } } return j; } void add(string s) { getnexts(s); int pos=kmp(ans,s,max(0,(int)ans.size()-(int)s.size())); for(int i=pos; i<s.size(); i++) { ans.push_back(s[i]); } } int main() { scanf("%d",&n); for(int i=1; i<=n; i++) { cin>>s[i]; } ans=s[1]; for(int i=2; i<=n; i++) { add(s[i]); } cout<<ans; }