• kmp hdu 3336 下标从1开始


    kmp 模板

    数组下标从1开始 P[1,2, . . .  m]   T[1,2  ,3   ...  n]

    void Prefix_Func()
     {
         int i,k;
         k=0;
         next[1]=0;
         for(i=2;i<=m;i++)
         {
            while(k>0 && P[k+1]!= P[i])
                k=next[k];
            if(P[k+1] == P[i])
                k++;
            next[i]=k;
         }
     }

    数组下标从0开始

    void Prefix_Func()
     {
         int i,k;
         k=-1;
         next[0]=-1;
         for(i=1;i<m;i++)
         {
            while(k>=0 && P[k+1]!= P[i])
                k=next[k];
            if(P[k+1] == P[i])
                k++;
            next[i]=k;
         }
     }

    注意的地方:

    a,表示从0开始    b, 表示从1开始

    1,  a,     初始 next[0]  = -1

          b,            next[1] = 0

    2,   i 的取值范围  

    a,      一个是  [1------m-1 ]

    b,            一个是 2--------m  

    3,  while  循环终止条件  

    a,           一个是  k>=0  

    b,            一个是   k>0

    hdu  3336 计算模板中前缀的个数

    //设dp[i] :以string[i]结尾的字符字串的前缀总数
    // 结论    :         dp[j]= dp[i] +1 , 其中 next[j] = i

     代码如下:  本题最好用下标从1开始

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string>
     4 #include<string.h>
     5 #define N 200005
     6 using namespace std;
     7 char P[N];
     8 int dp[N];
     9 int n,m;
    10 int next[N];
    11  void Prefix_Func()
    12  {
    13      int i,k;
    14      k=0;
    15      next[1]=0;
    16      for(i=2;i<=m;i++)
    17      {
    18         while(k>0 && P[k+1]!= P[i])
    19             k=next[k];
    20         if(P[k+1] == P[i])
    21             k++;
    22         next[i]=k;
    23      }
    24  }
    25 int main()
    26 {
    27     int t,sum;
    28     cin>>t;
    29     while(t--)
    30     {
    31         sum=0;
    32         cin>>m;
    33         scanf("%s",P+1);
    34         Prefix_Func();
    35         dp[0]=0;
    36         for(int i=1;i<=m;i++)
    37             dp[i]=dp[next[i]]+1;
    38 
    39         for(int i=1;i<=m;i++)
    40         {
    41             sum=(sum+dp[i])%10007;
    42         }
    43         cout<<sum<<endl;
    44     }
    45     return 0 ;
    46 }
  • 相关阅读:
    十、补充数据类型set
    MySQL-[--001--]-报错( (1292, u"Truncated incorrect DOUBLE value: '424a000000066'") result = self._query(query))
    四、robotframework生成几种随机数
    三、robotframework封装的关键字-数据库使用
    二、robotframework接口测试-常用关键字介绍
    五、python中MD5加密
    Redis系列
    MonkeyRunnermac
    akka
    Apache Spark 1.6 Hadoop 2.6 Mac下单机安装配置
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3570968.html
Copyright © 2020-2023  润新知