ZZULI 1861: 斗破苍穹【回文字符串】
2016-04-12 19:16
519 查看
1861: 斗破苍穹
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 206 Solved: 47
SubmitStatusWeb
Board
Description
有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.
于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!
Input
第一行输入一个T(T <= 50), 表示一共有T组测试数据. 接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.Output
每行一个整数X, 表示该组字符串中所包含的最长回文长度.Sample Input
3aba
abc
aabaa
Sample Output
31
5
思路:回文子串(Manacher)算法
AC-code:
#include<cstdio> #include<cstring> int p[200005]; int main() { int T,i,len,j,mx,id,sum; char str[100005],s[200005]; scanf("%d",&T); while(T--) { scanf("%s",str); len=strlen(str); s[0]='?',s[1]='#'; for(i=0;i<len;i++) { s[2*i+2]=str[i]; s[2*i+3]='#'; } s[2*i+2]='\0'; mx=0;id=0; for(j=1;j<2*i+2;j++) { if(mx>j) p[j]=p[2*id-j]>mx-j?mx-j:p[2*id-j]; else p[j]=1; while(s[j-p[j]]==s[j+p[j]]) p[j]++; if(p[j]+j>mx) { mx=p[j]+j; id=j; } } sum=0; for(i=1;i<j;i++) sum=sum>p[i]?sum:p[i]; printf("%d\n",sum-1); } return 0; }
相关文章推荐
- 启用新博客地址
- solr入门之设计自己的Java本地缓存工具类
- struts2 利用 POI 导出 excel
- 虚拟现实外包公司— VR开发编辑器意义重大 印证VR不仅服务于用户
- 泛型集合遍历数据(里氏转换)
- 8猜数字
- python解析excel
- linux扩展根分区详细步骤
- 求n的因子的个数和。.
- 第6周项目1-分数类的雏形(2)
- mysql的loaddatainfile的用法
- 美团机器学习中的数据清洗与特征挖掘实践
- LeetCode之16----3Sums Closest
- LeetCode之16----3Sums Closest
- Python 优雅的操作字典
- px、pt、dp和 sp
- 30分钟配置好-Puppet: 强大的中心化配置管理系统
- 分布式文件系统HDFS原理与操作
- hdu1754 I hate it【splay树】
- 剑指offer系列之34:数组中的逆序对