您的位置:首页 > 其它

KMP

2015-07-30 20:06 405 查看
主要是理解算法吧,,,,,next的运用。。。。。

至于代码还是用模板吧,,自己写比较难理解?感觉。。。。。。

HDU  1686   纯模板

#include<stdio.h>
#include<string.h>
char F[10010010];
char S[10010];
int next[10010];
int lenF;
int lenS;
void get_next()
{

    int i=1;

    int j=0;

    next[1]=0;

    while(i<=lenS)

    {

        if(j==0||S[i]==S[j])

        {

            i++;

            j++;

            if(S[i]!=S[j])

            next[i]=j;

            else next[i]=next[j];

        }

        else

        {

           j=next[j];

         }

         //printf("%d\n",j);

    }
}

void kmp()
{

    int i=1;

    int j=1;

    int count=0;

    while(i<=lenF&&j<=lenS)

    {

        if(j==0||F[i]==S[j])

        {

            i++;

            j++;

        }

        else

        {

            j=next[j];

        }

        if(j>lenS)

        {

            count++;

            j=next[j];

        }

    }

    printf("%d\n",count);
}
int main()
{

    int t;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%s",S+1);

        scanf("%s",F+1);

        lenS=strlen(S+1);

        lenF=strlen(F+1);

        get_next();

        kmp();

    }

HDU2203

#include<stdio.h>

#include<string.h>

char a[200001],b[100001];

int next[100001];

int len1,len2;

void get_next()

{

    int i=1;

    int j=0;

    next[1]=0;

    while(i<=len2)

    {

        if(j==0||b[i]==b[j])

        {

            i++; j++;

            if(b[i]!=b[j]) next[i]=j;

            else next[i]=next[j];

        }

        else

        {

            j=next[j];

        }

    }

}

void kmp()

{

    int i=1,j=1;

    int count=0;

    while(i<=len1&&j<=len2)

    {

        if(j==0||a[i]==b[j])

        {

            i++; j++;

        }

        else j=next[j];

        if(j>len2)

        {

            count++;

            j=next[j];

        }

    }

    if(count>0) printf("yes\n");

    else printf("no\n");

}

int main()

{

    while(scanf("%s",a+1)!=EOF)

    {

        len1=strlen(a+1);

        for(int i=1;i<=len1;i++)

        {

            a[len1+i]=a[i];

        }

        len1=strlen(a+1);

        //printf("%s****\n",a+1);

        scanf("%s",b+1);

        len2=strlen(b+1);

        get_next();

        kmp();

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

    }

    return 0;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: