poj 2752 KMP(next数组的运用)
2016-07-21 22:57
330 查看
点击打开链接
总结 : next数组的作用 next[j]=k 就是找到与 bj-1 结尾为后缀相等的最长前缀 b1~bx-1
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int M =410000; char b[M]; int Next[M],ans[M],lb; void Get_Next() { int i=0,k=-1; Next[0]=-1; while(i<lb) { if(k==-1||b[k]==b[i]) { Next[i+1]=k+1; i++; k++; } // bk与bi 失配时 // 因为 next[i]=k next[k]=k' //所以b1~bk'-1 == bi-k'~bi-1 // 若bk'==bi 则前缀 b1~bk' ==bi-k'~bi成立 则 next[i+1]=k'+1 else { k=Next[k]; } } } int main() { while(scanf("%s",b)!=EOF) { lb=strlen(b); Get_Next(); // 长度为 1~n 要求后缀(j,n) 1=<j<=n 相等的 前缀个数(1,i) 1<=i<=n // 如果在 b 处失配 利用next =k :"b1~bk-1" ==" bn-(k-1)... bn-1" 如果bk==bn 则得出一解 // 若使 x =next[k] 则 "b1~bx-1" == "bk-1-(x-1)~~ bk-1" == "bn-(x-1) ~~ bn-1" // 不断时 k=next[k] 直到k为-1为止 int i=0; int k=Next[lb-1]; while(k!=-1) { if(b[k]==b[lb-1]) { ans[++i]=k+1; } k=Next[k]; } for(int j=i;j>=1;j--) { printf("%d ",ans[j]); } printf("%d\n",lb); } return 0; }
总结 : next数组的作用 next[j]=k 就是找到与 bj-1 结尾为后缀相等的最长前缀 b1~bx-1
相关文章推荐
- Objective-C & Sprite Kit太空历险记 : 3. 军官训练营——控制你的代码
- 简记:一次修复CentOS7因卸载多余内核后引起启动文件丢失及其后续问题的过程
- agios插件之监控AEP主机InBound和Awaiting数量
- 两个HashMap里面的内容是否相等?
- hdu 3870(平面图最小割转最短路)
- 关于类中定义的内部接口
- 【OpenCV笔记 12】OpenCV边缘检测之canny算子
- 多态性-运算符重载
- 笑一笑
- java-并发-解决锁竞争的问题
- 编译部署LAMP+xcache (php-fpm模式)
- POJ 3104 Drying
- Android编码命名规范
- READING NOTE: Spatially Supervised Recurrent Convolutional Neural Networks for Visual Object Trackin
- Java Se----选择语句,分支结构和循环语句
- zookeeper节点失效重连机制
- 如何让你的UWP应用程序无缝调用几何作图
- 最短路dijkstar
- Objective-C & Sprite Kit太空历险记 : 2. 初级训练营——Objective-C基础(下)
- js调用大全含ajax