<span style="font-size:18px;">/*kmp 1711 http://acm.hdu.edu.cn/showproblem.php?pid=1711*/
/*kmp算法详解 http://v.youku.com/v_show/id_XMzUxMjAwNzI=.html*/
#include <stdio.h>
int a[1000005];
int b[10005];
int next[10005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int la,lb;
int i,j;
scanf("%d %d",&la,&lb);
for(i=1;i<=la;i++) //主串
scanf("%d",&a[i]);
for(i=1;i<=lb;i++) //标准串
scanf("%d",&b[i]);
i=1,j=0;
while(i<lb) //求next值
{
if(j==0 || b[i]==b[j]) //j若回溯到0(即标准串第一个数了)或两者相等,则i,j一起后移,
{
i++;
j++;
next[i]=j; //若next[i]=k,则存在 前i-1个字串相等,
}
else
j=next[j]; //若不存在两者相等,则回溯到比k更短的字串,即j回溯到next值记录的位置
}
i=1,j=1;
while(i<=la && j<=lb) //和主串的比较与上面的方法一样
{
if(a[i]==b[j] || j==0)
{
i++;
j++;
}
else
j=next[j];
}
printf("%d\n",j>lb?i-j+1:-1);
}
return 0;
}</span>