1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
using namespace std; #define MAXN 1000000 #define MAXM 100000 int T[MAXN],P[MAXM],Next[MAXM];
void (int M) { Next[0] = -1; int i = 0, j = -1; while(i<M) { if(j==-1 || P[i]==P[j]) { i++,j++; if(P[i]!=P[j]) Next[i] = j; else Next[i] = Next[j]; } else j = Next[j]; } }
int KMP(int N,int M) { int i=0,j=0; while(i<N && j<M) { if(T[i]==P[j] || j==-1) i++,j++; else j = Next[j]; } if(j==M) return i-M+1; else return -1; } int main() { int N,M,C; scanf("%d",&C); while(C--) { int i; scanf("%d %d",&N,&M); for(i=0;i<N;i++) scanf("%d",&T[i]); for(i=0;i<M;i++) scanf("%d",&P[i]); if(M>N) printf("-1n"); else { MakeNext(M); printf("%dn",KMP(N,M)); } } return 0; }
|
近期评论