博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3068 - 最长回文串(manacher算法)
阅读量:4344 次
发布时间:2019-06-07

本文共 1291 字,大约阅读时间需要 4 分钟。

题目链接 

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 25520    Accepted Submission(s): 9422
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算法的模板题目,可以在O(n)时间内计算出最长的回文串,算法讲解如下

        

#include
#include
#include
#include
using namespace std;const int maxn = 110050;char s1[maxn], s2[maxn * 2];int p[maxn * 2], ans;//把'abab\0'这种普通的字符串变成'$a#b#a#b#\0'便于计算void init() { ans = 0; s2[0] = '$'; s2[1] = '#'; int i, j; for (i = 0, j = 2; s1[i]; ++i, ++j) { s2[j] = s1[i]; s2[++j] = '#'; } s2[j] = '\0';}void manacher() { memset(p, 0, sizeof(p)); int id = 0, mx = 1;//初始化条件 for (int i = 1; s2[i]; ++i) {//p[0]不需要处理 p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1; while (s2[i - p[i]] == s2[i + p[i]]) ++p[i]; if (i + p[i] > mx) { mx = i + p[i]; id = i; } ans = max(ans, p[i] - 1); }}int main() { while (scanf("%s", s1) == 1) { init(); manacher(); printf("%d\n", ans); } return 0;}

转载于:https://www.cnblogs.com/wafish/p/10465454.html

你可能感兴趣的文章
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>
原生和jQuery的ajax用法
查看>>
iOS开发播放文本
查看>>
20145202马超《java》实验5
查看>>
JQuery 事件
查看>>
main(argc,argv[])
查看>>
第四阶段 15_Linux tomcat安装与配置
查看>>
NAS 创建大文件
查看>>
学习笔记-模块之xml文件处理
查看>>
接口测试用例
查看>>
Sybase IQ导出文件的几种方式
查看>>
linux 系统下 tar 的压缩与解压缩命令
查看>>
阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
查看>>