码迷,mamicode.com
首页 > 其他好文 > 详细

KMP

时间:2015-07-30 21:29:34      阅读:123      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!