/*
分三步,主函数,kmp,求next数组
主函数就是输入输出
书上的代码默写
求next数组太恶心!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXM = 10000;
const int MAXN = 1000000;
int pattern[MAXM];
int nexttable[MAXM];
int text[MAXN];
void Getnexttable(int m){
int j=0;
nexttable[j]=-1;
int i=nexttable[j];
while(j<m){
if(-1==i||pattern[i]==pattern[j]){
++i;
++j;
nexttable[j]=i;//得把数组j的每个位置都填上!!!!!!!!!!!!!!!!!
}else{
i=nexttable[i];//变态!!!!!!!!!!!!!!!!!!!!!!!
}
}
}
int KMP(int m,int n){
Getnexttable(m);
int i=0;//不应该是-1,不然就白跑了一趟
int j=0;//不应该是-1,不然就白跑了一趟
while(i<m&&j<n){
if(-1==i||pattern[i]==text[j]){
++i;
++j;
}else{
i = nexttable[i];
}
}
// if(i==m&&pattern[i]==text[j]){//不能这么写呀,不对,只到m-1
if(i==m){
return j-i+1;
}else{
return -1;
}
}
int main(){
int caseNumber;
int m;
int n;
scanf("%d",&caseNumber);
for(int i=0; i<caseNumber; ++i)
{
scanf("%d %d",&n,&m);
for(int k=0; k<n; ++k)
{
scanf("%d",&text[k]);
}
for(int j=0; j<m; ++j)
{
scanf("%d",&pattern[j]);
}
printf("%d\n",KMP(m,n));
}
}