现在的位置: 首页 > 综合 > 正文

hdu 1711 Number Sequence

2018年12月28日 ⁄ 综合 ⁄ 共 625字 ⁄ 字号 评论关闭

KMP匹配问题

#include<stdio.h>
#include<string.h>
int m,n;
int a[1000002],b[10002],next[10002];
void getnext(const int *p) 
{     
    int i,j;
    next[0]=-1;
    i=0;j=-1;
    while(i!=m)
    {
        if(j==-1||p[i]==p[j])
        {
            i++;j++;
            if(p[i]!=p[j])
              next[i]=j;
            else next[i]=next[j];
        }
        else j=next[j];
    }

} 
int KMP(const int *s,const int* p) 
{     
    int i=0,j=0;
    while(i!=n&&j!=m)
    {
        if(s[i]==p[j])
        {
            i++;j++;
        }
        else
        {
            if(next[j]==-1)
            {
                j=0;i++;
            }
            else j=next[j];
        }
    }
    if(j==m)return i-j+1;
     else   return -1;
}
int main()
{
    int i,j,flag,t;
    scanf("%d",&t);
    while(t--)
    {
        flag=0;
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(j=0;j<m;j++)
            scanf("%d",&b[j]);
        if(n<m)
            puts("-1");
        else
        {
            getnext(b);
            flag=KMP(a,b);
            printf("%d\n",flag);
        }
    }
    return 0;
}

抱歉!评论已关闭.