zoukankan      html  css  js  c++  java
  • 洛谷P3375 kmp模板

    题目链接

    #include <cstring>
    #include <cstdio>
    #include <iostream>
    #include <vector>
    using namespace std;
    const int N = 1e6+10;
    #define ll long long
    vector<int>nxt,f;//f[i]表示匹配长度,nxt[i]表示前缀和后缀相等的个数,不包括最后一个
    void get_next(string a){
        int n = a.size() - 1;
        nxt.resize(n+1);
        nxt[1] = 0;
        for(int i=2,j=0;i<=n;i++){
            while(j>0 && a[i]!=a[j+1])j = nxt[j];
            if(a[i]==a[j+1])
                j++;
            nxt[i] = j;
        }
    }
    void kmp(string a,string b){
        int n = a.size()-1,m = b.size() - 1;
        f.resize(m+1);
        for(int i=1,j=0;i<=m;i++){
            while(j>0 && (j==n || b[i]!=a[j+1]))j = nxt[j];
            if(b[i]==a[j+1]) j++;
            f[i] = j;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        string s;
        string sub;
        cin >> s;
        cin >> sub;
        s = " " + s;
        sub = " " + sub;
        int n = sub.size() - 1;
        int m = s.size() - 1;
        get_next(sub);
        kmp(sub,s);
        for(int i=1;i<=m;i++){
            if(f[i] == n){
                cout << i - n + 1 << '
    ';
            }
        }
        for(int i=1;i<=n;i++){
            cout << nxt[i] << ' ';
        }
        return 0;
    }
    
  • 相关阅读:
    洛谷 P3391文艺平衡树 【fhq_treap】
    食物链(转自yekehe2002大神)
    TX
    黑匣子——KEY
    Splay初学习
    BZOJ2330_糖果_KEY
    BZOJ3224_普通平衡树_KEY
    BZOJ2730_矿场搭建_KEY
    BZOJ1452_Count_KEY
    初识主席树_Prefix XOR
  • 原文地址:https://www.cnblogs.com/hh13579/p/12803274.html
Copyright © 2011-2022 走看看