HDU1711-KMP-水题

纯KMP,入门题,不知道读入挂加朴素匹配能不能过

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <ctype.h>
 5 #include <cstdlib>
 6 #include <stack>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <string>
11 #include <cmath>
12 
13 
14 
15 using namespace std;
16 
17 int M,N,T;
18 int A[1000100],B[10100];
19 int f[10100];
20 
21 void getFail(int *P)
22 {        
23     f[0] = 0;f[1] = 0;
24     for(int i=1;i<M;i++)
25     {
26         int j = f[i];
27         while(j && P[i] != P[j]) j = f[j];
28         f[i+1] = P[i] == P[j] ? j+1 : 0;
29     }
30 }
31 
32 int find(int *T,int *P)
33 {
34     getFail(P);
35     int j=0;
36     for(int i=0;i<N;i++)
37     {
38         while(j && T[i] != P[j]) j = f[j];
39         if( T[i] == P[j] ) j++;
40         if(j == M) return i-M+2;
41     }
42     return -1;
43 }
44 
45 
46 int main()
47 {
48     scanf("%d",&T);
49     while(T--)
50     {
51         scanf("%d%d",&N,&M);
52         for(int i=0;i<N;i++) scanf("%d",&A[i]);
53         for(int i=0;i<M;i++) scanf("%d",&B[i]);
54             
55         printf("%d
",find(A,B));
56     }
57 }
原文地址:https://www.cnblogs.com/helica/p/4730437.html