扩展kmp

刘雅琼写的论文讲得挺好的,你们先学习下,然后再来看代码就比较简单了!!

 

#include<stdio.h>
#include<string.h>
int next[1000],extend[1000];
char S[1000],T[1000];
void get_next()
{
    int a,p,k,j,len;
    int L;
    len=strlen(T);
    next[0]=len;
    a=0;
    while(a<len-1&&T[a]==T[a+1])
        a++;
    next[1]=a;
    a=1;
    for(k=2;k<len;k++)
    {
        p=a+next[a]-1;
        L=next[k-a];
        if(k-1+L>=p)
        {
            j=p-k+1>0?p-k+1:0;
            while(j+k<len&&T[j+k]==T[j])
                j++;
            next[k]=j;
            a=k;
        }
        else
            next[k]=L;
    }
}
void get_extend()
{
    get_next();
    int a,p,L,k,j,slen,tlen,len;
    slen=strlen(S);tlen=strlen(T);
    len=slen>tlen?tlen:slen;
    a=0;
    while(a<len&&S[a]==T[a])
        a++;
    extend[0]=a;
    a=0;
    for(k=1;k<slen;k++)
    {
        p=a+extend[a]-1;
        L=next[k-a];
        if(k-1+L>=p)
        {
            j=p-k+1>0?p-k+1:0;
            while(j+k<slen&&j<tlen&&S[j+k]==T[j])
                j++;
            extend[k]=j;
            a=k;
        }
        else
            extend[k]=L;
    }
}
int main()
{
    int i;
    while(scanf("%s%s",S,T)!=EOF)
    {
       get_extend();
       for(i=0;i<strlen(T);i++)
           printf("%d ",next[i]);
       printf("\n");
       for(i=0;i<strlen(S);i++)
           printf("%d ",extend[i]);
       printf("\n");
    }
    return 0;
}

 

 

 

posted on 2013-06-30 11:19  后端bug开发工程师  阅读(364)  评论(0编辑  收藏  举报

导航