Shirlies
宁静专注认真的程序媛~

一道字符串匹配的题目,仅仅借此题练习一下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\n",(getNext()+m)%MOD);
51     }
52 
53     return 0;
54 }
代码如下:

 

posted on 2013-09-26 23:28  Shirlies  阅读(329)  评论(0编辑  收藏  举报