zoukankan      html  css  js  c++  java
  • 扩展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("
    ");
           for(i=0;i<strlen(S);i++)
               printf("%d ",extend[i]);
           printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    playbook的复用
    playbook 任务标签
    playbook handlers 触发器
    playbook循环语句
    playbook条件语句
    Ansible变量
    每日总结4.13
    每日总结4.12
    每日总结4.9
    每日总结4.8
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3163409.html
Copyright © 2011-2022 走看看