扩展kmp入门---扩展kmp

来源:互联网 发布:工业设计需要软件 编辑:程序博客网 时间:2024/06/15 19:15


最头痛这个算法了 加上kmp 都学习了接近一个星期都不会 现在勉勉强强可以将模板打出来 

 辛苦辛苦,虽然菜,但还是要学会的。

过程:http://blog.csdn.net/Littlewhite520/article/details/77427017

图片参考博客 :https://www.61mon.com/index.php/archives/186/


这个是求解next数组  和extend数组  

#include<iostream>#include<string.h>using namespace std;string s,t;int nt[1000],extend[1000];int n,m,i,j;void get_next(string &t,int nt[]){int a=0,p=0;//  a是用来纪录上一个点的匹配的公共缀 p为当前字符的最远的匹配的下标nt[0]=m; //第一个元素的值设置为m总长度for(i=1;i<m;i++){if(i>=p||i+nt[i-a]>=p) //当i大于p时 或者{if(i>=p)p=i;//p如果小于i p只能从i处开始while(p<m&&t[p]==t[p-i])    p++;//意思就是将主串t的第i个开始匹配 t从0开始的字符串 因此需要用t[p]和t[p-i]比较是否相等 若相等则将p最远距离拉远可以得到当前字符的与t串的最长公共前缀长了nt[i]=p-i; //意思从当前i位置匹配了几个与t串的相同的前缀a=i;}else nt[i]=nt[i-a];}}void get_extend(string &s,string &t,int extend[],int nt[]){int a=0,p=0;get_next(t,nt);for(i=0;i<n;i++){if(i>=p||i+nt[i-a]>=p){if(i>=p)    p=i;while(p<n&&p-i<m&&s[p]==t[p-i]) p++;extend[i]=p-i;a=i;}else extend[i]=extend[i-a];}}int main(){while(cin>>s>>t){n=s.size(),m=t.size();get_extend(s,t,extend,nt);cout<<"next数组:"<<endl;for(i=0;i<m;i++)cout<<nt[i]<<" ";cout<<endl<<"扩展kmp数组:"<<endl;for(i=0;i<n;i++)cout<<extend[i]<<" ";}return 0;}