hdu 1686(kmp)

 1 /*
 2 *  kmp
 3 */
 4 #include <cstdio>
 5 #include <iostream>
 6 
 7 using namespace std;
 8 
 9 const int N = 10005;
10 const int M = 1000005;
11 
12 int next[N];
13 char pat[N], str[M];
14 
15 void indexNext() {
16     int k = 0;
17     next[1] = 0;
18     for (int i=2; pat[i]; ++i) {
19         while (k && pat[k+1]!=pat[i]) k = next[k];
20         if (pat[k+1] == pat[i]) ++k;
21         next[i] = k;
22     }
23 }
24 
25 int kmp() {
26     int k = 0, cs = 0;
27     int lenPat = strlen(pat) - 1;
28     for (int i=1; str[i]; ++i) {
29         while (k && pat[k+1]!=str[i]) k = next[k];
30         if (pat[k+1] == str[i]) ++k;
31         if (k == lenPat) ++cs, k = next[k];
32     }
33     return cs;
34 }
35 
36 int solve() {
37     indexNext();
38     return kmp();
39 }
40 
41 int main() {
42     int t;
43     scanf ("%d", &t);
44     str[0] = pat[0] = '#';
45     while (t--) {
46         scanf ("%s%s", pat+1, str+1);
47         printf ("%d\n", solve());
48     }
49     return 0;
50 }

 

posted on 2012-05-07 17:41  Try86  阅读(184)  评论(0)    收藏  举报