zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    MySQL 连接 触发器 函数 视图 存储过程
    Django的ORM2
    nmp安装vuejs
    Docker 技术入门与实践(第3版)笔记
    docker官方 入门
    centos 各目录介绍
    阿里云es 安装docker
    linux命令
    centos 7 mini 安装青岛OJ
    leetcode_304. 二维区域和检索
  • 原文地址:https://www.cnblogs.com/hgangang/p/11830722.html
Copyright © 2011-2022 走看看