匹配子串

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
int a[1000005],b[10005];
int Next[10005];
int n,m;
void setNext()
{
    int i=0,j=-1;
    Next[i]=j;
    while(i<m)
    {
        if(j==-1||b[i]==b[j]) Next[++i]=++j;
        else j=Next[j];
    }
    return ;
}
int KMP()
{
    int i=0,j=0;
    setNext();
    while(i<n)
    {
        if(j==-1||a[i]==b[j])
        {
            i++;
            j++;
            if(j==m) return i-m+1;
        }
        else j=Next[j];
    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        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]);
        printf("%d\n",KMP());
    }
    return 0;
}