题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
#include <iostream> #include <string> #include <cstring> #include <cstdio> using namespace std; /************************************************************************************************************* 找到第一次匹配成功的位置 id,看着板子写的 *************************************************************************************************************/ int Next[10005]; int s[1000005],p[10005]; void getNext(int m){ int i=0,j=-1; Next[0]=-1; while(i < m){ while(j != -1 && p[i] != p[j]) j = Next[j]; if(p[++i] == p[++j]) Next[i]=Next[j]; else Next[i]=j; } } int Kmp(int n,int m){ getNext(m); int i = 0,j = 0; while(i < n && j < m){ while(j != -1 && s[i] != p[j]) j = Next[j]; i++; j++; } if(j >= m) return i-m+1; else return -1; } int main() { int T,m,n; cin>>T; while(T--){ scanf("%d%d",&n,&m); for(int i = 0;i < n;i ++) scanf("%d",&s[i]); for(int i = 0;i < m;i ++) scanf("%d",&p[i]); if(n < m) cout<<"-1"<<endl; else cout<<Kmp(n,m)<<endl; } return 0; }