您的位置:首页 > 产品设计 > UI/UE

HDU Number Sequence (KMP模板)

2017-09-14 19:32 351 查看



                                       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");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息