这是一道基础的kmp的题目。做法就不细说了。
对于kmp的知识,有篇博客介绍得非常全面——从头到尾彻底理解KMP(2014年8月4日版)
#include<stdio.h> int n,m,next[10000],s[1000000],p[10000]; void getnext() { int k=0,j=1; next[0]=-1;next[1]=0; while (j<m-1) { if (k==-1||p[j]==p[k]) { k++; j++; next[j]=k; } else k=next[k]; } } int kmp() { int i=0; int j=0; while (i<n&&j<m) { if (s[i]!=p[j]) while (s[i]!=p[j]) i++; else { while (j!=-1&&j<m) { if (s[i]==p[j]) { i++; j++; if (j==m) break; } else j=next[j]; } if (j==-1) j++; } } if (j==m) return i-j+1; else return -1; } int main() { int t,i; 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]); getnext(); printf("%d ",kmp()); } }