HDU 3068 最长回文
来源:互联网 发布:网络戴口罩女主播照片 编辑:程序博客网 时间:2024/06/18 16:52
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
分析
马拉车模板题
代码
#include <algorithm>#include <iostream>#include <cstring>#include <complex>#include <cstdio>#include <queue>#include <cmath>#include <map>#include <set>#define N 110005#define INF 0x7fffffff#define sqr(x) ((x) * (x))#define pi acos(-1)char ch[N << 1];int len[N << 1];int read(){ int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9'){if (ch == '-') f = -1; ch = getchar();} while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();} return x * f;}void manacher(char s[], int l){ int L = 0; ch[L++] = '$'; ch[L++] = '#'; for (int i = 0; i < l; i++) ch[L++] = s[i], ch[L++] = '#'; len[L] = 0; int mx = 0, p = 0; for (int i = 0; i < L; i++) { len[i] = mx > i ? std::min(len[2 * p - i], mx - i) : 1; while (ch[i + len[i]] == ch[i - len[i]]) len[i]++; if (i + len[i] > mx) mx = i + len[i], p = i; }}char s[N];int main(){ while(~scanf("%s",s)) { int L = strlen(s); manacher(s, L); int ans = 0; for (int i = 0; i < 2 * L + 2; i++) { ans = std::max(ans, len[i] - 1); } printf("%d\n", ans); } }
0 0
- HDU 3068 ( 最长回文 )
- HDU-3068 最长回文
- hdu 3068 最长回文
- Hdu 3068 最长回文
- HDU 3068 最长回文
- HDU-3068-最长回文
- hdu-最长回文-3068
- hdu 3068 最长回文
- 【HDU】3068 最长回文
- hdu 3068 最长回文
- HDU 3068 最长回文
- hdu 3068 最长回文
- hdu 3068 最长回文
- hdu-3068-最长回文
- HDU 3068 最长回文
- HDU 3068 最长回文
- HDU 3068 最长回文
- HDU - 3068 最长回文
- Fiddler 工作原理
- 字符串之间以及与int float double转换
- CSS中隐藏内容的3种方法及属性值
- js字符串补0
- 使用TFS实现ABP项目的持续集成(我靠,截了这么多图片都消失了,CSDN牛掰啊)
- HDU 3068 最长回文
- 题目1201:二叉排序树
- 自己整理的eclipse的快捷键
- strsep的作用
- web worker
- Learning with ensembles
- VS2013创建CUDA文件
- LeetCode 217. Contains Duplicate
- 【java】二叉树重建