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;
}

  

posted on 2019-11-10 16:27  师姐的迷弟  阅读(151)  评论(0编辑  收藏  举报

导航