#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n[10005]; int s[1000005],a[10005]; int len1,len2; void kmp() { n[0]=0; for(int i=1,k=0;i<len2;i++) { while(k>0&&a[k]!=a[i]) k=n[k-1]; if(a[k]==a[i]) k++; n[i]=k; } } int main() { ///cout << "Hello world!" << endl; int T; cin>>T; while(T--) { scanf("%d%d",&len1,&len2); for(int i=0;i<len1;i++) scanf("%d",&s[i]); for(int i=0;i<len2;i++) scanf("%d",&a[i]); kmp(); int flag=-1; for(int i=0,j=0;i<len1;i++) { while(j>0&&a[j]!=s[i]) j=n[j-1]; if(a[j]==s[i]) j++; if(j==len2) { flag=i-len2+1; break; } } if(flag>=0) printf("%d\n",flag+1); else puts("-1"); } return 0; }
原文:http://www.cnblogs.com/chen9510/p/6895782.html