HDOJ-3068 最长回文 (manacher求最长回文串)
来源:互联网 发布:声鉴软件下载 编辑:程序博客网 时间:2024/06/05 06:25
最长回文
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[N];//记录每个位置的最长回文数char origin[N], modified[N];//原始字符串和插入#后的字符串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)); }}
阅读全文
0 0
- HDOJ-3068 最长回文 (manacher求最长回文串)
- HDOJ - 3068 最长回文 Manacher
- 【Manacher】 HDOJ 3068 最长回文
- hdoj 3068 最长回文 【Manacher】
- hdoj 3068最长回文【Manacher】
- Manacher求最长回文
- hdu 3068 最长回文 Manacher求最大回文串
- hdoj 3068 最长回文 【manacher算法】
- hdoj 最长回文 3068 (字符串&manacher)
- HDOJ 3068 最长回文(Manacher)
- Manacher算法 +HDOJ 3068 (最长回文)
- HDU 3068 最长回文 [Manacher回文串]
- 最长回文串 manacher
- manacher(最长回文串)
- 最长回文串-manacher
- 最长回文串 Manacher
- Manacher算法求最长回文子串
- Manacher算法求最长回文子串
- snprintf用法解析
- ROS学习笔记(九)
- 处理棋盘格贴图四方连续问题
- 自学Python之Python基础:(二)Python容器:列表、元组、字典
- sys:treeselect 树型框 获取制定ID
- HDOJ-3068 最长回文 (manacher求最长回文串)
- hdoj 6237 A Simple Stone Game
- js获取url传递参数,js获取url?号后面的参数window.location
- php根据时间调用不同商务通js
- java程序员从笨鸟到菜鸟之(三十九)多态之this和super
- Swift-泛型学习和实例总结
- 文本编码&二进制运算
- mysql数据库导出命令
- asterisk服务器的搭建和配置