POJ 3461 Oulipo(KMP)
第一个KMP,纪念纪念。。。虽然比着模版打的,理解模版,真的好短。
1 #include <stdio.h> 2 #include <string.h> 3 char str1[10001],str2[1000001]; 4 int next[10001]; 5 int main() 6 { 7 int t,len1,len2,num,i,j; 8 scanf("%d",&t); 9 while(t--) 10 { 11 scanf("%s%s",str1,str2); 12 len1 = strlen(str1); 13 len2 = strlen(str2); 14 next[0] = -1; 15 num = 0; 16 j = -1; 17 for(i = 1;i <= len1-1;i ++)//预处理 18 { 19 while(j >= 0&&str1[j+1] != str1[i])//如果已经匹配了一部分,但是j+1的与i不匹配,就退回到next值 20 j = next[j];//直到找到str[j+1] = str1[i]为止,很明显如果找不到j会变为-1,停止循环 21 if(str1[j+1] == str1[i])j++; 22 next[i] = j; 23 } 24 j = -1; 25 for(i = 0;i <= len2-1;i ++)//和预处理神似。。 26 { 27 while(j >= 0&&str1[j+1] != str2[i]) 28 j = next[j]; 29 if(str1[j+1] == str2[i]) j ++; 30 if(j == len1-1)//如果找到了,继续查找。 31 { 32 num ++; 33 j = next[j]; 34 } 35 } 36 printf("%d\n",num); 37 } 38 return 0; 39 }