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

      

  • 相关阅读:
    ssm框架实现多条件查询分页(模拟百度算法)
    spring与mybatis的整合
    spring入门
    mybatis foreach标签用法
    图书借阅系统简易异步分页源码
    Jquery常用选择器
    mvc
    Java连接数据库 jdbc
    java学习线路
    Mybatis传递多个参数的几种方式
  • 原文地址:https://www.cnblogs.com/hgangang/p/11830722.html
Copyright © 2011-2022 走看看