/*
Kmp水过
只要将整数看成是字符一样处理
用Kmp一套就可以了
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define INF 0x7FFFFFFF
using namespace std;
int a[1000005], b[10005], next[10005];
int n, m;
void Getnext()
{
int i = 0, j = -1;
memset(next,0,sizeof(next));
next[0] = -1;
while(i < m)
{
if(j==-1 || b[i]==b[j])
{
i++;
j++;
next[i] = j;
}
else j = next[j];
}
}
void Kmp()
{
int i = 0, j = 0, k;
Getnext();
while(i<n && j<m)
{
if(j==-1 || a[i]==b[j])
{
k = i;
i++;
j++;
}
else j = next[j];
}
if(j >= m)
cout << k-m+2 << endl;
else cout << -1 << endl;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
//freopen("E:\\我的程序\\in.txt","r",stdin);
//freopen("E:\\我的程序\\out.txt","w",stdout);
#endif
int t;
cin >> t;
while(t-- && scanf("%d%d",&n,&m))
{
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
for(int i = 0; i < m; i++)
scanf("%d",&b[i]);
Kmp();
}
return 0;
}
HDU 1711
最新推荐文章于 2020-06-21 16:22:43 发布