hdu 1711(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 str[M], pat[N], next[N];
13 
14 void indexNext(int lenPat) {
15     int k = 0;
16     next[1] = 0;
17     for (int i=2; i<=lenPat; ++i) {
18         while (k && pat[k+1]!=pat[i]) k = next[k];
19         if (pat[k+1] == pat[i]) ++k;
20         next[i] = k;
21     }
22 }
23 
24 int kmp(int lenPat, int lenStr) {
25     int k = 0;
26     for (int i=1; i<=lenStr; ++i) {
27         while (k && pat[k+1]!=str[i]) k = next[k];
28         if (pat[k+1] == str[i]) ++k;
29         if (k == lenPat) return i - lenPat + 1;
30      }
31      return -1;
32 }
33 
34 int main() {
35     int t;
36     scanf ("%d", &t);
37     while (t--) {
38         int n, m;
39         scanf ("%d%d", &n, &m);
40         for (int i=1; i<=n; ++i) scanf ("%d", &str[i]);
41         for (int i=1; i<=m; ++i) scanf ("%d", &pat[i]);
42         indexNext(m);
43         printf ("%d\n", kmp(m, n));
44     }
45     return 0; 
46 }

 

posted on 2012-05-06 21:16  Try86  阅读(153)  评论(0)    收藏  举报