hdu3068——最长回文
2016-05-31 20:17
357 查看
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
题意就是求最长回文字串的长度
给出一个只由小写英文字符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 <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <cstdio> //#include <set> #include <vector> #include <iomanip> #include <stack> #include <map> #include <queue> #define MAXN 110010 #define mod 2012 #define INF 0x3f3f3f3f using namespace std; char Ma[MAXN*2]; int Mp[MAXN*2]; void Manacher(char s[],int len) { int l=0; Ma[l++]='$'; Ma[l++]='#'; for(int i=0;i<len;++i) { Ma[l++]=s[i]; Ma[l++]='#'; } Ma[l]=0; int mx=0,id=0; for(int i=0;i<l;++i) { Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1; while(Ma[i+Mp[i]]==Ma[i-Mp[i]]) Mp[i]++; if(i+Mp[i]>mx) { mx=i+Mp[i]; id=i; } } } char s[MAXN]; int main() { ios::sync_with_stdio(false); while(cin>>s) { int len=strlen(s); Manacher(s,len); int ans=0; for(int i=0;i<2*len+2;i++) ans=max(ans,Mp[i]-1); cout<<ans<<endl; } return 0; }
相关文章推荐
- 设计模式—简单工厂模式
- OS_ioStream
- ofbiz详解(Java开放电子商务平台)
- 立体类族共有的抽象类
- Android开发陷阱:利用PendingIntent传递唯一的Intent
- php项目开发经验-2个月学习php经历
- HDU 5363 Key Set
- 操作系统知识点整理
- 伯克利大学“机器学习(Practical Machine Learning)"课件及相关资料
- 从重庆滴滴和出租车争扯 看共享经济“转正困境”
- OC视频教程29课-第01讲 Classes
- Middle-题目123:335. Self Crossing
- Android图像处理(一)色调、饱和度、亮度
- iOS库的介绍以及如何使用CocoaPods管理库(2016最新版本)
- IOS面试题
- 地图 大头针
- C 字符串中sizeof() 和 strlen()
- 工资数组类
- HDU 4568 Hunter
- Guice 注入--(privateModule,intall(),expose())