hdu 1686 Oulipo

https://vjudge.net/problem/HDU-1686

题意:

求模板串在文本串中出现的次数。

思路:

果果的kmp模板题啊,所以直接上模板啦。用的是lrj大大的白书的模板。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 char text[1000005];
 5 char w[10005];
 6 int fl[1000005];
 7 
 8 void getfail(char *P,int *f)
 9 {
10     int m = strlen(P);
11     f[0] = 0;f[1] = 0;
12 
13     for (int i = 1;i < m;i++)
14     {
15         int j = f[i];
16 
17         while (j && P[i] != P[j]) j = f[j];
18 
19         f[i+1] = P[i] == P[j] ? j+1 : 0;
20     }
21 }
22 
23 int find(char *T,char *P,int *f)
24 {
25     int ans = 0;
26     int n = strlen(T),m = strlen(P);
27 
28     getfail(P,f);
29 
30     int j = 0;
31 
32     for (int i = 0;i < n;i++)
33     {
34         while (j && P[j] != T[i]) j = f[j];
35         if (P[j] == T[i]) j++;
36         if (j == m) ans++;
37     }
38 
39     return ans;
40 }
41 
42 int main()
43 {
44     int t;
45 
46     scanf("%d",&t);
47 
48     while (t--)
49     {
50         memset(fl,0,sizeof(fl));
51 
52         scanf("%s",w);
53         scanf("%s",text);
54 
55         int ans = find(text,w,fl);
56 
57         printf("%d\n",ans);
58     }
59 
60     return 0;
61 }

 

 

posted @ 2017-07-27 22:04  qrfkickit  阅读(140)  评论(0编辑  收藏  举报