KMP匹配问题
#include<stdio.h> #include<string.h> int m,n; int a[1000002],b[10002],next[10002]; void getnext(const int *p) { int i,j; next[0]=-1; 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(const int *s,const int* p) { int i=0,j=0; while(i!=n&&j!=m) { if(s[i]==p[j]) { i++;j++; } else { if(next[j]==-1) { j=0;i++; } else j=next[j]; } } if(j==m)return i-j+1; else return -1; } int main() { int i,j,flag,t; scanf("%d",&t); while(t--) { flag=0; scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d",&a[i]); for(j=0;j<m;j++) scanf("%d",&b[j]); if(n<m) puts("-1"); else { getnext(b); flag=KMP(a,b); printf("%d\n",flag); } } return 0; }