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 }

 

你可能感兴趣的:(HDU)