题目:http://acm.hdu.edu.cn/showproblem.php?pid=1711
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int maxn = 1000005;
using namespace std;
int a[maxn],b[maxn];
int n,m;
int next[maxn];
void getnext(int *s){
next[0]= -1;
int i = 0,k = -1;
while(i < m){
if(k ==-1||s[i] == s[k]){
k++;i++;
if(s[k] != s[i])
next[i] = k;
else
next[i] = next[k];
}
else
k =next[k];
}
}
int kmp(int *a,int *b){
int i = 0,j = 0;
while(i < n&&j< m){
if(j ==-1 || a[i] == b[j]){
i++;
j++;
}
else
j =next[j];
}
if(j == m)
returni-j+1;
return -1;
}
int main(){
int t;
scanf("%d",&t);
while (t--) {
scanf("%d%d",&n,&m);
for(inti = 0;i <n;i++)
scanf("%d",a+i);
for(inti = 0;i <m;i++)
scanf("%d",b+i);
getnext(b);
printf("%d\n",kmp(a,b));
}
return 0;
}