字符串:HDU3064-最长回文
来源:互联网 发布:复数矩阵的qr分解例题 编辑:程序博客网 时间:2024/06/05 08:37
最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
解题心得:
- 就是一个manacher的模板题,但是要注意,如果数组开小了,可能会反馈TLE。
manacher算法:http://blog.csdn.net/yopilipala/article/details/76572938
#include<bits/stdc++.h>using namespace std;const int maxn = 3e5;char s1[maxn],s[maxn];int manacher(int tot){ int max_right = 0,pos = 0,rl[maxn],Max = 0;; for(int i=0;i<tot;i++) { rl[i] = 1; if(i < max_right) rl[i] = min(rl[pos*2-i],max_right - i); while(i-rl[i] >=0 && i+rl[i] < tot && s[i+rl[i]] == s[i-rl[i]]) rl[i]++; if(rl[i] + i - 1 > max_right) { max_right = rl[i]+i-1; pos = i; } if(rl[i] > Max) Max = rl[i]; } return Max-1;//注意要减1}int main(){ while(scanf("%s",s1) != EOF) { int len = strlen(s1); int tot = 0; for(int i=0;i<len;i++) { s[tot++] = '#'; s[tot++] = s1[i]; } s[tot++] = '#';//最后的这个不要掉了 int ans = manacher(tot); printf("%d\n",ans); }}
阅读全文
0 0
- 字符串:HDU3064-最长回文
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 字符串最长回文串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长的回文字符串
- 最长回文子字符串
- 求解最长回文字符串
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串Manacher
- 最长回文字符串
- 最长回文字符串
- 最长回文字符串
- ThreadLocal小案例
- pat乙级1025
- 原创移动端高清、多屏适配方案
- 【笔记】Activity、Fragment、Service生命周期梳理
- HDU 2063 过山车(匈牙利算法)
- 字符串:HDU3064-最长回文
- Spring源码和jar包下载步骤
- UVa 11001
- 机制
- adt-bundle-windows 20140702 下载地址
- 初学java--面向对象的概念和类的认识
- v4l2驱动框架
- 爬取百度搜索结果的爬虫
- 修改MySQL的账号密码