POJ 3461 KMP

链接:

http://poj.org/problem?id=3461

代码:

31 char a[MAXN], b[MAXN];
32 int Next[MAXN];
33 int sum;
34 
35 void buildNext(char P[]) {
36     int m = strlen(P);
37     int i = 0, j;
38     j = Next[0] = -1;
39     while (i < m) {
40         while (-1 != j && P[i] != P[j]) j = Next[j];
41         Next[++i] = ++j;
42     }
43 }
44 
45 void kmp(char P[], char T[]) {
46     int n = strlen(T), i = 0;
47     int m = strlen(P), j = 0;
48     buildNext(P);
49     while (i < n) {
50         while (-1 != j && T[i] != P[j]) j = Next[j];
51         i++, j++;
52         if (j >= m) sum++, j = Next[j];
53     }
54 }
55 
56 int main() {
57     int T;
58     cin >> T;
59     while (T--) {
60         sum = 0;
61         memset(Next, 0, sizeof(Next));
62         scanf("%s%s", a, b);
63         kmp(a, b);
64         cout << sum << endl;
65     }
66     return 0;
67 }

 

posted @ 2017-04-30 17:03  Flowersea  阅读(187)  评论(0编辑  收藏  举报