扩展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;
}
辛苦辛苦,虽然菜,但还是要学会的。
过程: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;
}
相关文章推荐
- 扩展kmp入门+比赛模板
- 扩展kmp入门---hd Best Reward 3613
- hdu 4300 Clairewd’s message(kmp/扩展kmp)
- hdoj 1711 Number Sequence 【KMP 入门--晕晕滴】
- hdu2594之KMP入门
- 扩展kmp(HDU4333)
- linux下php扩展开发入门之hello word
- HDU 4333 Revolving Digits(KMP:循环节+扩展KMP)
- 扩展KMP
- hdu4333 扩展kmp
- 《精通正则表达式》学习笔记——第2章:入门示例扩展
- chrome扩展入门
- hdu2594 Simpsons’ Hidden Talents LCS--扩展KMP
- Chrome扩展及应用开发 入门笔记(一)
- KMP入门必看
- Swift快速入门之协议与扩展
- KMP 算法入门
- hdu4333(扩展KMP)
- hdu 4333 扩展KMP
- poj 3376 扩展kmp求回文加字典树