算法导论-KMP

来源:互联网 发布:swfobject.js 官网 编辑:程序博客网 时间:2024/06/07 04:44

本代码为算法导论一书中伪代码的实现

刚刚测试,有点问题,日后修改

#include<iostream>#include<cstdio>#include<cstring>using namespace std;long long pai[1000000];char T[1000000];char P[1000000];unsigned long n;unsigned long m;void KMP(){    long long q=0;    for(int i=0;i<n;i++)    {        while(q>0 && T[i]!=P[q])            q=pai[q-1]+1;        if(T[i]==P[q])//T[i]和P[q]是当前比较对象            q=q+1;        if(q==m)            cout<<"第一个匹配位置是:"<<i-m<<endl;    }}void PAI(){    pai[0]=0;    long long k=0;    for(int q=1;q<m;q++)//pai[q]表示Tq后缀与前缀匹配的最大长度    {        while(k>0 && P[q]!=P[k])            k=pai[k-1]+1;        if(P[q] == P[k])        {            k=k+1;        }        pai[q]=k;    }}int main(){    cout<<"请输入文本字符串"<<endl;    scanf("%s",T);    cout<<"请输入模式串"<<endl;    scanf("%s",P);    n=strlen(T);    m=strlen(P);    PAI();    //for(int i=0;i<m;i++)     //   cout<<pai[i]<<" ";    KMP();    return 0;}
0 0