我的第一道KMP。
把两个数列分别当成KMP算法中的模式串和目标串,这道题就变成了一个KMP算法模板题。
#include<stdio.h> #include<string.h> #define N 1000005 #define M 10005 int a[N],b[M]; int next[M]; int n,m; void setNext() { int i,j; i=0; j=-1; next[i]=j; while(i<m) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } return ; } int KMP() { int i,j; i=j=0; setNext(); while(i<n) { if(j==-1||a[i]==b[j]) { i++; j++; if(j==m) return i-m+1; } else j=next[j]; } return -1; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int i; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<m;i++) scanf("%d",&b[i]); int temp; temp=KMP(); printf("%d\n",temp); } return 0; }