您的位置:首页 > 其它

扩展kmp入门---扩展kmp

2017-08-27 13:38 162 查看
最头痛这个算法了 加上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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: