zoukankan      html  css  js  c++  java
  • hdu 3336【Count the string】(KMP)

    一道字符串匹配的题目,仅仅借此题练习一下KMP

    因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加起来就OK了(再此结果上还应该加上字符串的长度,因为每个从头开始的字符串本身也可以去匹配自己的),即将next中值不为-1和0的个数统计出来即可。

    用GCC编译的,时间用了46MS。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAXLEN 200005
     4 #define MOD 10007
     5 
     6 int next[MAXLEN];
     7 char myChar[MAXLEN];
     8 
     9 int getNext()
    10 {
    11     int i = 0,j = -1;
    12     int sum = 0;
    13     int len = strlen(myChar);
    14     memset(next,0,sizeof(int));
    15 
    16     next[i] = j;
    17 
    18     while(i < len)
    19     {
    20         if(j == -1 || myChar[i] == myChar[j])
    21         {
    22             i ++;
    23             j ++;
    24             next[i] = j;
    25             if(j != -1 && j != 0)
    26             {
    27                 sum ++;
    28                 sum = sum % MOD;
    29             }
    30         }
    31         else
    32         {
    33             j = next[j];
    34         }
    35     }
    36 
    37     return sum;
    38 }
    39 
    40 int main()
    41 {
    42     int n,m;
    43 
    44     scanf("%d",&n);
    45     while(n --)
    46     {
    47         scanf("%d",&m);
    48         memset(myChar,0,sizeof(char));
    49         scanf("%s",myChar);
    50         printf("%d
    ",(getNext()+m)%MOD);
    51     }
    52 
    53     return 0;
    54 }
    代码如下:
  • 相关阅读:
    C#控件刷新
    [转载] 尺度不变特征变换匹配算法
    C++ windows 多线程 互斥锁
    堆栈内存申请,以及32位程序内存上限
    dumpbin检查Dll
    CV_Assert
    Linux复习
    操作系统复习
    P/NP问题
    程序
  • 原文地址:https://www.cnblogs.com/Shirlies/p/3341958.html
Copyright © 2011-2022 走看看