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\n",find(A,B)); 56 } 57 }