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 }

 

posted @ 2012-07-20 10:12  Naix_x  阅读(135)  评论(0编辑  收藏  举报