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

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

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7317    Accepted Submission(s): 2500
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
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:            
 
题目:
中文见上。
思路:
manacher裸题。

主要是练习下。

manacher算法解说见

思路主要是先给字符串加上隔离符。把回文串长度奇偶同一为求奇数回文长度。求出以每一个字符为中心字符的最大回文长度。后面的结果利用前面的结果。

p[i]-1为原回文串的长度。

具体见代码:
#include
#include
#include
using namespace std;const int INF=0x3f3f3f3f;const int maxn=111000;int p[maxn<<1],len;char buf[maxn],st[maxn<<1];void init(){ int i; len=strlen(buf); st[0]='$',st[1]='#'; for(i=0;i
i?

min(mx-i,p[2*id-i]):1; while(st[i+p[i]]==st[i-p[i]])//不用操心越界。由于st[0]='$' p[i]++; if(i+p[i]>mx) mx=i+p[i],id=i; } } int main() { int i,ans; while(~scanf("%s",buf)) { ans=1; init(); manacher(); for(i=2;i<len;i++) ans=max(ans,p[i]); printf("%d\n",ans-1); } return 0; }

转载地址:http://bmpjo.baihongyu.com/

你可能感兴趣的文章
springboot整合ElasticSearch出现的问题
查看>>
线性代数基础
查看>>
Java中的访问权限
查看>>
redis事务和脚本
查看>>
[zz]linux elf loader漏洞
查看>>
练笔--字符串,向量和数组2
查看>>
运维数据库平台~inception审核规则详解
查看>>
sap 给集团分配一个逻辑系统
查看>>
Nginx配置中文域名
查看>>
IOS任务
查看>>
在eclipse里的 flex 没有可视化的编辑
查看>>
python 列出出当前目录及所有子目录下的文件
查看>>
RabbitMQ错误检查
查看>>
OSI模型
查看>>
对于数据库连接池的一些思考和MyBatis的集成与使用
查看>>
[SDOI2016]征途
查看>>
[JSOI2018]军训列队
查看>>
[TJOI2013]最长上升子序列
查看>>
Extjs之window异步拦截关闭事件beforeClose的实现
查看>>
Ubuntu 12.10 安装 PHP
查看>>