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

KMP小结

时间:2014-10-20 23:26:53      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   ar   for   sp   2014   on   log   


next数组表示的是,最长前缀和后缀相等的长度。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;

const int N=1000000;

int next[N];
char s[N],t[N];
/*********KMP小结**********/

//求next数组
void getNext(int lt)
{
    int k=-1,i=0;
    next[0]=-1;
    while(i<lt)
    {
        if(k==-1||s[k]==t[i])
            next[++i]=++k;
        else
            k=next[k];
    }
}

//KMP求模板串第一次出现的位置
int getIndex(int ls,int lt)
{
    getNext(lt);
    int i=0,k=0;
    while(i<ls&&k<lt)
    {
        if(k==-1||s[i]==t[k])
        {
            i++;
            k++;
        }
        else
            k=next[k];
    }
    if(k==lt) return i-lt+1;    //返回的下标从0,开始算。
    else return -1;

}

//KMP求模板串出现的次数

int getCnt(int ls,int lt)
{
    getNext(lt);
    int k=0,cnt=0;
    for(int i=0;i<ls;i++)
    {
        while(k!=-1&&s[i]!=t[k])
            k=next[k];
        if(s[i]==t[k]) k++;
        if(k==lt){
            cnt++;
            k=next[k];
        }

    }
    return cnt;
}


int main()
{
    cin>>s>>t;
    int ls=strlen(s);
    int lt=strlen(t);
    cout<<getIndex(ls,lt)<<endl;
    return 0;
}


KMP小结

标签:blog   io   os   ar   for   sp   2014   on   log   

原文地址:http://blog.csdn.net/code_or_code/article/details/40321265

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