POJ 2752 KMP中next数组的应用
2016-07-17 21:13
211 查看
题意:
让你从小到大输出给的字符串中既是前缀又是后缀的子串的长度。
思路:
先要了解这个东西:
KMP中next数组表示的含义:记录着字符串匹配过程中失配情况下可以向前多跳几个字符,它描述的也是子串的对称程度。
那么我们可以用next数组来乱搞
怎么个乱搞法呢?
前缀的next[len]长度的子串和后缀next[len]长度的子串完全相同
这样就是一个解了。
我们可以不断地通过next数组向前查找直到0为止。
sort一下输出解就大功告成啦
// by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int next[400500],alen,k,ans[400500]; char a[400500]; void get_next(){ int j=0;next[1]=0; for(int i=2;i<=alen;i++){ while(j&&a[i]!=a[j+1])j=next[j]; if(a[i]==a[j+1])++j; next[i]=j; } } int main(){ while(~scanf("%s",a+1)){ k=0; alen=strlen(a+1); get_next(); int temp=next[alen]; while(temp) { ans[++k]=temp; temp=next[temp]; } sort(ans+1,ans+1+k); for(int i=1;i<=k;i++)printf("%d ",ans[i]); printf("%d\n",alen); } }
相关文章推荐
- android studio 怎么将项目打包成apk文件
- 开发前端框架_1
- 蓝牙聊天
- 用virtualbox安装CentOS 7
- Android面试题整理(转载自 简书)
- 双重嵌套输出100以内全部素数
- Android二维码生成
- leetcode题解日练--2016.7.17
- CentOS yum 源的配置与使用
- Python--常见问题解决方案
- 机器学习基础 维基翻译 典则相关分析 多标签分类 及简单的sklearn例子
- IO图详解
- 判断一个栈是不是回文
- MFC 程序嵌入python 的调试
- 面向对象思维导图
- 家谱树
- HTML中Select的使用详解
- 顺序存储结构与链式存储结构的比较(也可以说的顺序表与链表的比较)
- 面试相关
- nyoj 1276 && 河南省第九届ACM竞赛E题