Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.

Input

The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].

Output

For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.

Sample Input

2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1

Sample Output

6
-1

思路:将第一次出现的i减去自身长度就可以了

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm> using namespace std;
void kmp_pre(int x[],int m,int next[]) {
int i,j;
j=next[0]=-1;
i=0;
while(i<m) {
while(-1!=j && x[i]!=x[j])j=next[j];
next[++i]=++j;
}
}
int next1[1000010];
int KMP_Count(int x[],int m,int y[],int n) { //x 是模式串,y 是主串
int i,j;
int ans=-1;
//preKMP(x,m,next);
kmp_pre(x,m,next1);
i=j=0;
while(i<n) {
while(-1!=j && y[i]!=x[j])j=next1[j];
i++;
j++;
// cout<<m<<endl;
if(j>=m) {
ans=i+1-m;
// cout<<next[j]<<endl;
j=next1[j];
break; }
}
return ans;
} int a[10005];
int b[1000005]; int main() {
int T;
cin>>T;
int lena,lenb;
while(T--) {
scanf("%d %d",&lena,&lenb);
for(int t=0;t<lena;t++)
{
scanf("%d",&a[t]);
}
for(int t=0;t<lenb;t++)
{
scanf("%d",&b[t]);
}
printf("%d\n",KMP_Count(b,lenb,a,lena));
} return 0;
}

最新文章

  1. Beta阶段第十次Scrum Meeting
  2. Java、Hibernate(JPA)注解大全
  3. Acronis True Image Home 2011 PXE服务器配置_qxxz_新浪博客
  4. Hadoop学习笔记(6) ——重新认识Hadoop
  5. Eclipse搭建Struts框架,及一个简单的Struts例子
  6. [原]H264帧内预测
  7. infinite-scroll插件无限滚动加载数据的使用
  8. 【Java基础】单例模式
  9. [原]CAS和Shiro在spring中集成
  10. 解决:eclipse导入android时工程下没有R文件的问题,以及style.xml文件报错
  11. [置顶] 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3
  12. Gradle第二步骤来创建学习Task
  13. DV工作流
  14. Vue.js动画在项目使用的两个示例
  15. Activity设置全屏显示的两种方式及系统自带theme属性解析
  16. Js调用exe程序方法(通过URL Protocol实现网页调用本地应用程序)
  17. react按需加载(getComponent优美写法),并指定输出模块名称解决缓存(getComponent与chunkFilename)
  18. 【LightOJ1370】Bi-shoe and Phi-shoe(欧拉函数)
  19. [摘译] IK: 操纵关节式物体的反向动力学和几何约束
  20. 10.18 nslookup:域名查询工具

热门文章

  1. DAY7-面向对象之多态与多态性
  2. MSSQL 当前数据库中已存在用户或角色,SQLServer2008,错误15023,
  3. CDN原理解析
  4. css知多少(11)——position(转)
  5. Struts2框架06 ValueStack
  6. ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)
  7. Java基础-集合框架-ArrayList源码分析
  8. Visual Studio2012快捷键总结
  9. HTML完全使用详解 PDF扫描版​
  10. C#socket通信时,怎样判断socket双方是否断开连接