Number Sequence
基础KMP模板题目;
我的模板与网上的模板也不太一样
具体我的思想参考视频
下面代码
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
using namespace std;
const int maxn=1000000+10,MAXN=1000000+10;
int a[MAXN],b[maxn];
int nextl[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int len1,len2;
scanf("%d%d",&len1,&len2);
for(int i=0; i<len1; i++)
{
scanf("%d",&a[i]);
}
for(int i=0; i<len2; i++)
{
scanf("%d",&b[i]);
}
if(len1<len2)
{
printf("-1\n");
continue;
}
int i=0,j=1;
nextl[0]=0;
memset(nextl,0,sizeof(nextl));
while(j<len1)//建立nextl数组
{
if(b[i]==b[j])
{
nextl[j]=i+1;
i++,j++;
}
else if(b[i]!=b[j]&&i!=0)
{
i=nextl[i-1];
}
else
{
nextl[j]==0;
j++;
}
}
// for(int x=0; x<len2; x++)
// {
// printf("%d ",nextl[x]);
// }
// printf("\n");
i=0,j=0;
int flag=0;
while(i<=len1)//对a数组进行匹配
{
if(j>=len2)
{
flag=1;
// printf("*-*\n");
break;
}
// printf("%d %d\n",i,j);
if(a[i]==b[j])
{
i++,j++;
}
else if(a[i]!=b[j]&&j!=0)
{
j=nextl[j-1];
}
else
{
i++;
}
}
if(flag==1)
{
printf("%d\n",i-len2+1);
}
if(flag==0)
{
printf("-1\n");
}
}
}