博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 3068 最长回文(manachar模板)
阅读量:7103 次
发布时间:2019-06-28

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

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:            
 

manachar讲解:   http://blog.csdn.net/bruce_zeng/article/details/8629572

 

代码:

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 using namespace std;13 #define N 110010*214 15 char s[N],str[N];16 int p[N];17 18 int init()19 {20 int i,j=0;21 str[j++]='$';22 for(i=0;s[i];i++){23 str[j++]='#';24 str[j++]=s[i];25 }26 str[j++]='#';27 str[j]='\0';28 return j;29 }30 31 void manachar(int n)32 {33 int mx=0,id,i;34 p[0]=0;35 for(i=1;i
i)37 p[i]=min(mx-i,p[2*id-i]);38 else39 p[i]=1;40 while(str[i-p[i]]==str[i+p[i]])41 p[i]++;42 if(p[i]+i>mx){43 mx=p[i]+i;44 id=i;45 }46 }47 }48 49 int main()50 {51 int n;52 while(~scanf("%s",s)){53 n=init();54 manachar(n);55 int ans=0;56 for(int i=1;i
ans)58 ans=p[i];59 }60 printf("%d\n",ans-1);61 }62 }

 

转载于:https://www.cnblogs.com/wangmengmeng/p/5478649.html

你可能感兴趣的文章
步步为营 .NET 代码重构学习笔记 七
查看>>
libevent(十三)evhttp事件处理流程
查看>>
1004. 西西弗斯式的命运——java
查看>>
前端基础-CSS
查看>>
软件版本说明 转
查看>>
[Spring入门学习笔记][maven]
查看>>
java运行时could not open ........jvm.cfg问题的解决
查看>>
Java - 集合框架
查看>>
C6000系列之C6455 DSP的EMIFA接口
查看>>
2-9
查看>>
从键盘上连续录入一批整数,比较并输出其中的最大值和最小值,当输入数字0时结束循环...
查看>>
2018焦作区域赛E. Resistors in Parallel
查看>>
html--特殊字符过滤
查看>>
Linux中断(interrupt)子系统之一:中断系统基本原理【转】
查看>>
SOA会不会造成IT黑洞
查看>>
查询存储过程所需参数
查看>>
HTML5 Web app开发工具Kendo UI Web教程:如何配置Kendo UI Calendar
查看>>
vue Element动态设置el-menu导航当前选中项
查看>>
session的使用
查看>>
Centos6.8通过yum安装mysql5.7
查看>>