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 }

 

相关文章:

  • 2021-11-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-24
  • 2021-11-02
  • 2022-12-23
  • 2021-10-22
猜你喜欢
  • 2022-12-23
  • 2022-01-09
  • 2022-12-23
  • 2021-10-04
  • 2021-11-15
  • 2021-08-24
  • 2021-07-24
相关资源
相似解决方案