HDU:1711 Number Sequence(KMP)

题意:给两组数组,如果第二个数组在第一个数组里面出现则输入第一次出现的位置,否则输出-1。

思路:标准的KMP模版题。

因为数组开小WA1次,没有注意到KMP匹配过程中子串应该从首字符的下标开始又WA1次。总之还是对KMP不熟悉。

 

#include <cstdio>
#include <algorithm>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int L,l;
int s[1000000+5] ,t[10000+5];
int nextval[10000+5];
void get_nextval()
{
    int i=1,j=0;
    memset(nextval,0,sizeof(nextval));
    nextval[1]=0;
    while(i<l)
    {
        if(j==0||t[i]==t[j])
        {
            i++;
            j++;
            if(t[i]==t[j])
                nextval[i]=nextval[j];
            else
                nextval[i]=j;
        }
        else
            j=nextval[j];
    }
}
int Index_KMP()
{
    int i=1,j=1;
    get_nextval();
    while(i<=L&&j<=l)
    {
        if(j==0||s[i]==t[j])
        {
            i++;
            j++;
        }
        else j=nextval[j];
    }
    if(j>l)
        return i-l;
    else
        return -1;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&L,&l);
        memset(s,0,sizeof(s));
        memset(t,0,sizeof(t));
        for(int i=1; i<=L; ++i)
            scanf("%d",&s[i]);
        for(int i=1; i<=l; ++i)
            scanf("%d",&t[i]);
        int ans=Index_KMP();
        printf("%d\n",ans);
    }
    return 0;
}


 

你可能感兴趣的:(字符串,KMP,模版题)