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; 
        } 
    } 
  • 相关阅读:
    linux常用命令
    PHP 魔术方法浅谈
    PHP常用的设计模式
    浅谈Restful
    进程,线程与协程的区别
    http与https的
    get与post的区别
    php连接数据库的两种方式
    DRF框架基本组件之过滤,搜索,排序
    DRF-JWT用户认证
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480315.html
Copyright © 2011-2022 走看看