poj 2752 Seek the Name, Seek the Fame(KMP)
2015-07-08 22:24
357 查看
题目:http://poj.org/problem?id=2752
大意就是求解给定字符串的所有前缀-后缀字符串(比如alala的前缀-后缀串是a,ala,alala),按照长度升序输出length。
正确理解了KMP的原理和精华解决这个问题是不难的。首先,一个字符串本身是它的最大前缀-后缀。接着,前缀函数得到的next[len]就是第二长的前缀-后缀串,next[next[len]]则是第二前缀-后缀串的前缀-后缀字串。所以重复这个求解的过程就能完成解题。
大意就是求解给定字符串的所有前缀-后缀字符串(比如alala的前缀-后缀串是a,ala,alala),按照长度升序输出length。
正确理解了KMP的原理和精华解决这个问题是不难的。首先,一个字符串本身是它的最大前缀-后缀。接着,前缀函数得到的next[len]就是第二长的前缀-后缀串,next[next[len]]则是第二前缀-后缀串的前缀-后缀字串。所以重复这个求解的过程就能完成解题。
#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=4e5+5; char s[maxn]; int snext[maxn],rev[maxn],len; void getnext(){ int i=0,j=-1; snext[0]=-1; while(i<len){ if(j==-1||s[i]==s[j]){ i++; j++; snext[i]=j; } else j=snext[j]; } } int main() { //freopen("cin.txt","r",stdin); int t,i,top; while(cin>>s){ len=strlen(s); getnext(); rev[0]=len; top=0; i=len; while(snext[i]>0){ rev[++top]=snext[i]; i=snext[i]; } for(i=top;i>0;i--)printf("%d ",rev[i]); printf("%d\n",rev[0]); } return 0; }
相关文章推荐
- 剑指offer 链表的逆序
- phpcms 标签
- 用C语言实现常用的几种排序
- Spring优势
- 【C语言】二维数组做形参
- C++ 使用 opencv 库时 Point 在已经引入了 core.hpp 的情况下仍无法识别的可能原因
- CATransition 转场动画
- 基于OpenCV,简单的使用Point Grey的SDK在MFC上打开单个或多个Point Grey相机
- java中volatile关键字的含义
- MySQL 之 触发器和事务控制
- Objective-C(十五、内存管理,MRC,循环引用,dealloc和setter方法)——iOS开发基础
- linux下redis安装
- Permutation Sequence
- Spring中的设计模式
- 大型网站图片服务器架构的演进
- Spring MVC体系结构
- gdb调试core文件
- [精通iOS开发(第5版)]第15章 Grand Central Dispatch和后台处理笔记
- 信息系统项目管理案例分析
- Activity的四种启动模式