zoukankan      html  css  js  c++  java
  • kmp模板

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    string a,b;
    const int maxn = 1e6+10;
    int ne[maxn],n,m;
    vector <int> Q;
    void getne(string s)
    {
        ne[1]=0;
        for (int i=2;i<=m;i++)
        {
            int k=ne[i-1];
            if (s[k+1]==s[i]) ++k;
            else
            {
                while (k>0&&s[k+1]!=s[i]) k=ne[k];
                if (s[k+1]==s[i]) ++k;
            }
            ne[i]=k;
        }
        return;
    }
    void kmp(string s,string t)
    {
        getne(t);
        int k=0;
        for (int i=1;i<=n;i++)
        {
            if (t[k+1]==s[i]) ++k;
            else
            {
                while(k>0&&t[k+1]!=s[i]) k=ne[k];
                if (t[k+1]==s[i]) ++k;
            }
            if (k==m)
            {
                Q.push_back(i-m+1);
                k=ne[k];
            }
        }
    }
    int main()
    {
        cin>>a>>b;
        n=a.size();m=b.size();
        a="0"+a;
        b="0"+b;
        kmp(a,b);
        for (int i=0; i<Q.size();i++)
        {
            printf("%d
    ",Q[i]);
        }
        for (int i=1;i<=m;i++)
        {
            i==m ? printf("%d
    ",ne[i]) : printf("%d ",ne[i]);
        }
        return 0;
    }
  • 相关阅读:
    暑假日报-11
    暑假日报-10
    暑假日报-9
    暑假日报-8
    暑假日报-7
    暑假日报-6
    暑假日报-5
    暑假日报-4
    暑假日报-3
    第二次集训的每日感想
  • 原文地址:https://www.cnblogs.com/ztdf123/p/11323233.html
Copyright © 2011-2022 走看看