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

扩展kmp

时间:2017-01-14 18:23:12      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:string   扩展   stream   ring   div   pre   blog   color   pac   

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[101],t[101];
int ls,lt;
int extend[101],next[101];
void getnext()
{
    int a=0;
    next[0]=lt;
    while(a<lt-1&&t[a]==t[a+1]) a++;
    next[1]=a;
    a=1;
    for(int k=2;k<lt;k++)
    {
        int p=a+next[a]-1;
        int l=next[k-a];//
        if(k-1+l>=p)//
        {
            int j=(p-k+1)>0 ? p-k+1 : 0;//
            while(k+j<lt&&t[k+j]==t[j]) j++;
            next[k]=j;
            a=k;
        }
        else next[k]=l;
    }
}
void exkmp()
{
    int a=0;
    int minlen=ls<lt ? ls : lt;
    while(a<minlen&&s[a]==t[a]) a++;
    extend[0]=a;
    a=0;
    for(int k=1;k<ls;k++)
    {
        int p=a+extend[a]-1;
        int l=next[k-a];//
        if(k-1+l>=p)//
        {
            int j=(p-k+1)>0 ? p-k+1 : 0;
            while(k+j<ls&&j<lt&&s[k+j]==t[j]) j++;
            extend[k]=j;
            a=k;
        }
        else extend[k]=l;
     } 
}
int main()
{
    while(cin>>s>>t)
    {
        ls=strlen(s);
        lt=strlen(t);
        getnext();
        exkmp();
        int maxn=0,k=-1;
        for(int i=0;i<ls;i++) printf("%d ",extend[i]);
    }
}

 

扩展kmp

标签:string   扩展   stream   ring   div   pre   blog   color   pac   

原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/6285719.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!