【poj 3461】Oulipo(字符串--KMP)

题意:求子串在文本串中出现了多少次。

解法:使用KMP的next[ ]和tend[ ]数组计数。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 const int N=10010,M=1000010;
 8 char s[N],ss[M];
 9 int n,m;
10 int next[N];//,tend[M];
11 
12 void kmp()
13 {
14     memset(next,0,sizeof(next));
15     int p=0;
16     next[1]=0;
17     for (int i=2;i<=n;i++)
18     {
19       while (s[i]!=s[p+1] && p) p=next[p];
20       if (s[i]==s[p+1]) p++;
21       next[i]=p;
22     }
23     //memset(tend,0,sizeof(tend));
24     int cnt=0; p=0;
25     for (int i=1;i<=m;i++)
26     {
27       while (ss[i]!=s[p+1] && p) p=next[p];
28       if (ss[i]==s[p+1]) p++;
29       //tend[i]=p;
30       if (p==n) cnt++;
31     }
32     printf("%d\n",cnt);
33 }
34 int main()
35 {
36     int T;
37     scanf("%d",&T);
38     while (T--)
39     {
40       scanf("%s%s",s+1,ss+1);
41       n=strlen(s+1),m=strlen(ss+1);
42       kmp();
43     }
44     return 0;
45 }

 

posted @ 2016-11-17 19:38  konjac蒟蒻  阅读(238)  评论(0编辑  收藏  举报