一道字符串匹配的题目,仅仅借此题练习一下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 }