扩展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;}
阅读全文
0 0
- 扩展kmp入门---扩展kmp
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展 KMP
- 扩展kmp
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- 扩展KMP
- *扩展KMP
- SQL的执行顺序
- 类中连接mysql数据库
- 疑难杂症——bash: /dev/null: Permission denied
- 如何利用C语言实现数组复制的功能
- 教程:基于访问控制的ABAP CDS视图权限
- 扩展kmp入门---扩展kmp
- [笔记分享] [Build] Android编译系统源代码之config.mk
- 移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)
- 编程思维题目-对喝汽水问题的解法整理
- raspberryPi树莓派安装nodejs
- 71.简化路径
- Qt 播放音频文件
- Mac系统终端命令行不执行命令 总出现command not found解决方法
- 博客绑定域名