Number Sequence
题目链接:点击打开链接
题意:有两个串,求第二个串是否存在第一个串中.
思路:直接kmp;
#include<iostream>
#include<cstring>
using namespace std;
int nextk[1000100];
int t[1000100],q[1000100];
int n,m;
void makenext()
{
int i=0,j=-1;
nextk[0]=-1;
while(i<m)
{
if(q[i]==q[j]||j==-1)
{
++i,++j;
nextk[i]=j;
}
else
j=nextk[j];
}
}
int kmp(int t[],int q[],int next[])
{
int i=0,j=0;
makenext();
while(i<n)
{
if(t[i]==q[j])
{
if(j==m-1) return i-(m-1)+1;
i++,j++;
}
else
{
j=nextk[j];
if(j==-1)
{
i++,j=0;
}
}
}
//cout<<j<<endl;
return -1;
}
int main()
{
int k,l,o;
cin>>o;
while(o--)
{
memset(t,0,sizeof t);
memset(q,0,sizeof q);
cin>>n>>m;
for(int i=0;i<n;i++)
scanf("%d",&t[i]);
for(int j=0;j<m;j++)
scanf("%d",&q[j]);
//scanf("%s %s",&t,&q);
printf("%d\n",kmp(t,q,nextk));
}
}