题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
思路:kmp模板,注意用scanf,不然超时。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 1000100; int a[maxn],b[maxn],p[maxn],n,m; void pre() { int i,j; for(i=1,j=0;i<m;i++) { while(j>0&&b[i+1]!=b[j+1]) j=p[j]; if(b[i+1]==b[j+1]) j++; p[i+1]=j; } } int kmp() { int i,j; for(i=0,j=0;i<n;i++) { while(j>0&&a[i+1]!=b[j+1]) j=p[j]; if(a[i+1]==b[j+1]) j++; if(j==m) { return i-j+2; } } return -1; } int main(void) { int t,i,j; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(p,0,sizeof(p)); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=m;i++) scanf("%d",&b[i]); pre(); printf("%d ",kmp()); } return 0; }