zoukankan      html  css  js  c++  java
  • KMP【模板】

    /*
    pku3461(Oulipo), hdu1711(Number Sequence)
    这个模板 字符串是从0开始的
    Next数组是从1开始的
    */
    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define met(a) memset(a,0,sizeof(a))
    using namespace std;
    const int mod=1e9+7;
    const int N = 1000002;
    int Next[N];
    char S[N], T[N];
    int slen, tlen;
    void getNext()
    {
        int j, k;
        j = 0; k = -1; Next[0] = -1;
        while(j < tlen)
            if(k == -1 || T[j] == T[k])
                Next[++j] = ++k;
            else
                k = Next[k];
    
    }
    /*
    返回模式串T在主串S中首次出现的位置
    返回的位置是从0开始的。
    */
    int KMP_Index()
    {
        int i = 0, j = 0;
        getNext();
    
        while(i < slen && j < tlen)
        {
            if(j == -1 || S[i] == T[j])
                i++,j++;
            else
                j = Next[j];
        }
        if(j == tlen)
            return i - tlen;
        else
            return -1;
    }
    /*
    返回模式串在主串S中出现的次数
    */
    int KMP_Count()
    {
        int ans = 0;
        int i, j = 0;
        if(slen == 1 && tlen == 1)
        {
            if(S[0] == T[0])
                return 1;
            else
                return 0;
        }
        getNext();
        for(i = 0; i < slen; i++)
        {
            while(j > 0 && S[i] != T[j])
                j = Next[j];
            if(S[i] == T[j])
                j++;
            if(j == tlen)
            {
                ans++;
                j = Next[j];
            }
        }
        return ans;
    }
    int main()
    {
    
        int TT;
        int i, cc;
        cin>>TT;
        while(TT--)
        {
            cin>>S>>T;
            slen = strlen(S);
            tlen = strlen(T);
            cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl;
            cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl;
        }
        return 0;
    }
    /*
    test case
    aaaaaa a
    abcd d
    aabaa b
    */
  • 相关阅读:
    日常练习-利用python的random模块模拟身份证号码
    学习笔记-redis
    学习笔记-AJAX&JSON
    学习笔记-JQuery
    学习笔记-Filter&Listener
    学习笔记-EL&JSTL
    学习笔记-Cookie&Session
    学习笔记-Response
    学习笔记-XML
    JToken中并没有Value这个属性,但在运行时可以看到,用dyna可以取到这个属性值
  • 原文地址:https://www.cnblogs.com/nublity/p/9403328.html
Copyright © 2011-2022 走看看