POJ2752 Seek the Name, Seek the Fame(KMP)
2015-10-02 14:30
302 查看
给出一个字符串,求所有公共前后缀的长度。
如:ababcababababcabab的公共前缀后缀:ababcababababcabab,ababcabab,abab,ab,我们不难发现,在每个公共前后缀的都包含了比他更短的公共前后缀(可能字符串本身除外)
因此,我们只需要求一次next值,next[i]表示str[0,i-1]中公共前后缀的长度。如果str[i-1]==str[next[i-1]],显然next[i]=next[i-1]+1,否则又变成了求str[0,next[i-1]]中前后缀的子问题。
如:ababcababababcabab的公共前缀后缀:ababcababababcabab,ababcabab,abab,ab,我们不难发现,在每个公共前后缀的都包含了比他更短的公共前后缀(可能字符串本身除外)
因此,我们只需要求一次next值,next[i]表示str[0,i-1]中公共前后缀的长度。如果str[i-1]==str[next[i-1]],显然next[i]=next[i-1]+1,否则又变成了求str[0,next[i-1]]中前后缀的子问题。
#include<cstdio> #include<cstring> #define MAXN 800010 using namespace std; char a[MAXN]; int len,Next[MAXN],ans[MAXN],cnt; int KMP(int llen) { int i,j; memset(Next,0,sizeof Next); Next[0] = -1; for(i = 1; i <= llen; i++) { j = Next[i-1]; while(j != -1&&a[i-1] != a[j]) j = Next[j]; Next[i] = j+1; } return Next[llen]; } int main() { while(scanf("%s",a) != EOF) { memset(ans,0,sizeof ans); cnt = 0; len = strlen(a); //for(int i = 0; i < len; i++) a[i+len] = a[i]; //len *= 2; ans[++cnt] = len; int res = KMP(len); if(res != -1) { ans[++cnt] = res; } while(1) { len = Next[len]; res = Next[len]; if(res == -1) break; ans[++cnt] = res; } printf("%d",ans[cnt-1]); for(int i = cnt-2; i >= 1; i--) printf(" %d",ans[i]); printf("\n"); } }
相关文章推荐
- JAVA实现数值的整数次方(《剑指offern》)
- 好虚啊.
- stm32f10x 标准外设固件库时钟配置函数分析
- iOS编程规范
- inux 下system函数原型:http://blog.chinaunix.net/uid-29191363-id-4020441.html
- 数据缺失值的4种处理方法
- Android Design: 九种常见Activity及代码解析之"Empty""Blank""Fullscreen"
- sizeof运营商
- 动画效果
- Chaperon简介
- sql server 2005 设置用于复制的文本类型大小
- 如何编写一个分布式数据库
- UVA 10891 Game of Sum (博弈论 + 区间dp)
- Ubuntu快速启动栏
- 归并排序求逆序对的个数
- 【C#】赖以生存的土壤--.NET Framework
- 问题:给定一个英语词典,找出其中的所有变位词集合。
- Android 仿网易新闻客户端Tab标签
- Java 读写文件相关
- GDI+学问------ 绘制可变角度的色彩渐变效果