Kmp

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 1000005
 4 int s[N];
 5 int p[N];
 6 int next[N];
 7 int m,n;
 8 void getnext(){
 9     int j=0,k=-1;
10     next[0]=-1;
11     while(j<m){
12         if(k==-1||p[j]==p[k]){
13             j++;
14             k++;
15             next[j]=k;
16         }
17         else
18             k=next[k];
19     }
20 }
21 int kmp(){
22     int i=0,j=0;
23     getnext();
24     while(i<n){
25         if(j==-1||s[i]==p[j]){
26             i++;
27             j++;
28         }
29         else
30             j=next[j];
31         if(j==m)
32             return i;
33     }
34     return -1;
35 }
36 int main(){
37     int t;
38     scanf("%d",&t);
39     while(t--){
40         scanf("%d%d",&n,&m);
41         for(int i=0;i<n;i++)
42             scanf("%d",&s[i]);
43         for(int i=0;i<m;i++)
44             scanf("%d",&p[i]);
45         if(kmp()==-1)
46             printf("-1
");
47         else
48             printf("%d
",kmp()-m+1);
49     }
50     return 0;
51 }
原文地址:https://www.cnblogs.com/thunder-110/p/9322148.html