1.Question:
没什么可说的,数字版本的KMP
2.Code:
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#define N 10005
using namespace std;
int data[N*100];
int pattern[N];
int nextp[N];
int n,m;
void getnext()
{
int k=-1;
int j=0;
nextp[0]=-1;
while(j<m)
{
if(k==-1||pattern[j]==pattern[k])
{
k++;
j++;
nextp[j]=k;
}
else k=nextp[k];
}
}
int count()
{
int i=0;
int j=0;
while(i<n&&j<m)
{
if(j==-1||data[i]==pattern[j]) i++,j++;
else j=nextp[j];
}
if(j==m) return i-j+1;
else return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&data[i]);
for(int i=0;i<m;i++) scanf("%d",&pattern[i]);
getnext();
cout<<count()<<endl;
}
return 0;
}