HDOJ-3068 最长回文 (manacher求最长回文串)
2017-12-01 15:56
387 查看
最长回文
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
代码:
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
代码:
#include<bits\stdc++.h> using namespace std; const int N = 1e6; int RL ;//记录每个位置的最长回文数 char origin , modified ;//原始字符串和插入#后的字符串 int manacher(char *s) { int res = 0; //插入字符# int len = strlen(s); int l = 0; modified[l++] = '@'; modified[l++] = '#'; for (int i = 0; i < len; i++) { modified[l++] = s[i]; modified[l++] = '#'; } //初始化能达到的右边边界R和此边界围绕的轴心pos int pos = 0; int R = 0; for (int i = 0; i < l; i++) { //当前点再右边边界左边 if (i < R) RL[i] = min(RL[2 * pos - i], R - i); //如果在边界右边只能暴力搜索 //先初始化为1 else RL[i] = 1; //从i开始左右对比,找到以i为中心的最长回文串,如果碰到两端字符不相同或者到边界就停止 while (modified[i - RL[i]] == modified[i + RL[i]]) RL[i]++; //更新pos和R if (i + RL[i] > R) { R = i + RL[i]; pos = i; } res = max(res, RL[i] - 1); } return res; } int main() { while (scanf("%s", origin) != EOF) { printf("%d\n", manacher(origin)); } }
相关文章推荐
- HDOJ3068 最长回文(Manacher)
- hdoj 最长回文 3068 (字符串&manacher)
- hdu 3068 最长回文 Manacher求最大回文串
- HDOJ 3068 最长回文(Manacher)
- hdoj3068--最长回文(manacher模板)
- hdoj 3068 最长回文 【manacher算法】
- 【Manacher】 HDOJ 3068 最长回文
- HDU 3068 最长回文 (Manacher最长回文串)
- hdu 3068 最长回文 (Manacher算法求最长回文串)
- hdoj 3068最长回文【Manacher】
- HDOJ - 3068 最长回文 Manacher
- Manacher HDOJ 3068 最长回文
- 【HDOJ3068】最长回文(manacher)
- hdoj 3068 最长回文 【Manacher】
- [HDOJ3068]最长回文
- HDU 3068 最长回文 【manacher模版】
- hdu 3068 最长回文_Manacher模板
- hdu 3068 最长回文 -Manacher
- hdu 3068 最长回文 manacher
- HDU 3068 最长回文(manacher O(n)求回文算法)