zoukankan      html  css  js  c++  java
  • [KMP][HDU3336][Count the string]

    题意

    计算所有S的前缀在S中出现了几次

    思路

    跟前缀有关的题目可以多多考虑KMP的NEXT数组

    #include <cstdio>
    #include <cstring> 
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    char S[2000000]; 
    int NEXT[2000000];
    int dp[2000000];//dp[i] 表示 以i结尾的子串与前缀相等的个数 d[i]=d[next[i]]+1;
                    //一开始还以为是 d[i]=next[i]+1; 在abab这个样例中 d[3]=3 显然有重复计算了 
    int len;
    int sum=0;
    void get_next()
    {
        for(int i=1;i<=len;i++)
        {
            int p=i-1;
            while(S[i]!=S[NEXT[p]+1]&&p!=0) p=NEXT[p];
            if(p!=0) NEXT[i]=NEXT[p]+1;                 //这种不else 的写法注意清空NEXT
            //else NEXT[i]=0; 
        }
    }
    int main()
    {
    //  freopen("a.in","r",stdin);
        int T;
        cin>>T;
        while(T--)
        {
            sum=0;
            cin>>len;
            memset(NEXT,0,sizeof(NEXT));
            scanf("%s",S+1);
            get_next(); 
            for(int i=1;i<=len;i++)
            {
                dp[i]=dp[NEXT[i]]+1;
                sum=(sum+dp[i])%10007;
            }
            cout<<sum<<endl; 
        } 
    } 
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480315.html
Copyright © 2011-2022 走看看