hdu1711 KMP
#include<stdio.h> #include<string.h> #define maxn 1000010 int next[maxn],s[maxn],p[maxn]; int n,m; void getnext() { int j,k; k=-1; j=0; next[0]=-1; while(j<m) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int kmp() { int i,j; getnext(); i=0; j=0; while(i<n) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=next[j]; if(j==m) { return i-m+1; } } return -1; } int main() { int i,j,t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); for(i=0;i<n;i++) scanf("%d",&s[i]); for(i=0;i<m;i++) scanf("%d",&p[i]); printf("%d\n",kmp()); } }