next数组讲解推荐这个,讲的比较好:http://www.cnblogs.com/c-cloud/p/3224788.html
hdu 1711
#include<cstdio> #include<cstring> #include<iostream> #include<stack> using namespace std; #define N 1000100 int n, m, Next[N], a[N], b[N]; void makeNext() { int q, k; Next[0]=0; for(q=1, k=0; q<m; q++) { while(k>0 && b[q]!=b[k]) k=Next[k-1]; if(b[q]==b[k]) k++; Next[q]=k; } } void kmp() { int i, q, f=0; makeNext(); for(i=0, q=0; i<n; i++) { while(q>0&&a[i]!=b[q]) q=Next[q-1]; if(a[i]==b[q]) q++; if(q==m) { f=1; printf("%d ", i+1-(m-1)); break; } } if(!f) printf("-1 "); } int main() { int T; scanf("%d", &T); while(T--) { memset(Next, 0, sizeof(Next)); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); scanf("%d%d", &n, &m); for(int i=0; i<n; i++) scanf("%d", &a[i]); for(int i=0; i<m; i++) scanf("%d", &b[i]); kmp(); } return 0; }