hdu 3068
2016-03-06 20:06
323 查看
题目大意: 中文题,很好理解;
题目分析: 10^6的数据, 这个时候我们所能够考虑的算法一般为O(n)和O(nlogn),再慢就会超时, 这里了解到了一种新的算法;
详细参见:http://www.felix021.com/blog/read.php?2040
博主讲的很容易理解了。
这里我贴上一个按照这个思路的ac代码,方便参考;
题目分析: 10^6的数据, 这个时候我们所能够考虑的算法一般为O(n)和O(nlogn),再慢就会超时, 这里了解到了一种新的算法;
Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串;
详细参见:http://www.felix021.com/blog/read.php?2040博主讲的很容易理解了。
这里我贴上一个按照这个思路的ac代码,方便参考;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 110000+10; char str[maxn], s[2*maxn]; int p[2*maxn]; int main() { while(~scanf("%s", str)){ int len = strlen(str); for(int i = 0; i < len; ++i){ s[2*i+1] = '#'; s[2*i+2] = str[i]; } s[0] = '$', s[2*len+1] = '#', s[2*len+2] = '\0'; len = strlen(s); int mx(0), id(0); for(int i = 1; i < len; ++i){ p[i] = mx > i ? min(mx-i, p[2*id-i]) : 1; while(s[i+p[i]] == s[i-p[i]]) p[i]++; if(i+p[i] > mx){ mx = i+p[i]; id = i; } } int ans = 0; for(int i = 0; i < len; ++i) ans = max(ans, p[i]); printf("%d\n", ans-1); } }
相关文章推荐
- poj3750单向循环链表
- 关于自然数集N到素数集P的一个单射的三种构造
- 一个简单的文本编辑器
- POJ 3991 Seinfeld
- bzoj1412[狼和羊的故事]最小割
- java特种兵读书笔记(6-2)——数据库之主从
- ansible安装配置及实例
- MYSQL错误 NO.1130 ERROR的解决
- MySql的安装
- 软件工程课程记录01
- Unity3d外包—就找北京动点软件(长年承接Unity3d软件、游戏项目外包)
- bootstrap的初学之路—one day
- JAVA数据库连接池实现
- 技术的定义
- iOS 知识碎片记录
- Django URL传递参数的方法总结
- 文件索引节点
- TCP的三次握手(建立连接)和四次挥手(关闭连接)
- Kinect外包团队— 2016中国VR开发者论坛第一期
- 关于if语句中的小细节