首页 > 其他 > 详细

KMP

时间:2015-07-30 21:28:33      阅读:227      评论:0      收藏:0      [点我收藏+]

主要是理解算法吧,,,,,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;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

KMP

原文:http://blog.csdn.net/zhangwenchi/article/details/47153899

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!