HDU Number Sequence (KMP模板)

来源:互联网 发布:红叶知弦小说 编辑:程序博客网 时间:2024/06/05 10:02

                                       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");        }    }}