/*
最基础的KMP算法题,只是把字符改为了数字
*/
#include <cstdio>
const int mMax = 10007;
const int nMax = 1000007;
int N, M;
int a[nMax],b[mMax];
int next[mMax];
void init()
{
scanf("%d %d", &N, &M);
int i;
for(i = 0; i < N; ++ i)
scanf("%d", &a[i]);
for(i = 0; i < M; ++ i)
scanf("%d", &b[i]);
}
void getNext()
{
next[0]=-1;
int i, j;
for(i = 0, j = -1; i < M; )
{
if(j == -1 || b[i] == b[j])
{
++ i;
++ j;
next[i] = j;
}
else
j = next[j];
}
}
int getIndex()
{
int i, j;
for(i = 0, j = 0; i < N && j < M; )
{
if(j == -1 || a[i] == b[j]) ++ i, ++j;
else j = next[j];
}
return j == M ? i - M + 1 : -1;
}
int main()
{
//freopen("f://data.in","r",stdin);
int T;
scanf("%d", &T);
while(T --)
{
init();
getNext();
printf("%d\n",getIndex());
}
return 0;
}
HDU 1711 Number Sequence(KMP)
最新推荐文章于 2018-09-03 14:05:28 发布