1 条题解

  • 0
    @ 2023-6-21 20:00:07

    C++ :

    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    using namespace std;
    
    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];
    
    }
    /*
    返回模式串在主串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;
        }
        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()
    {
        scanf("%s",S);
        scanf("%s",T);
        slen = strlen(S);
        tlen = strlen(T);
        getNext();
        printf("%d\n",KMP_Count());
        return 0;
    }
    
    • 1

    信息

    ID
    1016
    时间
    5000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    6
    已通过
    0
    上传者