http://acm.hdu.edu.cn/showproblem.php?pid=1711
首次接触KMP,自己都不是特别理解。在网上百度看了好几个帖子之后,对KMP也有了初步的理解。
#include <stdio.h> int a[1000010], b[10010], next[1000010]; void getnext( int n) { int i=0, j=-1; next[0]=-1; while(i<n) { if(j==-1 || b[i]==b[j]) next[++i]=++j; else j=next[j]; } } int KMP(int m, int n) { int i=0, j=0; while(i<m) { while((j==-1 || a[i]==b[j]) && j<n) i++, j++; if(j==n) return i-n+1; j=next[j]; } return -1; } int main() { int T; scanf("%d", &T); while(T --) { int m, n; scanf("%d %d", &m, &n); for(int i=0; i<m; i++) scanf("%d", &a[i]); for(int i=0; i<n; i++) scanf("%d", &b[i]); getnext( n); printf("%d\n", KMP(m, n)); } return 0; }