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 }