hdu3098 最长回文(manacher算法)
2015-08-11 11:22
246 查看
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
Sample Output
代码:
给出一个只由小写英文字符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<set> #include<map> #include<algorithm> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<cmath> using namespace std; char s[111000], x[222000]; int len[222000]; int main() { int id, maxlen; while(~scanf("%s", s)) { int l = strlen(s); for(int i = l;i>=0;i--) { x[2 * i + 2] = s[i]; x[2 * i + 1] = '#'; } x[0] = '*'; // puts(x); memset(len, 0, sizeof(len)); maxlen = 0, id = 0; for(int i = 1; i<2*l; i++) { if(len[id] + id > i) len[i] = min(len[2 * id - i], len[id] + id - i); else len[i] = 1; while(x[i + len[i]] == x[i - len[i]]) len[i] ++; if(len[id] +id < len[i] + i) id = i; if(len[i] > maxlen) maxlen = len[i]; } cout<<maxlen - 1<<endl; } return 0; }
相关文章推荐
- Tomcat Session管理机制(Tomcat源码解析七)
- JAVA并发编程之 CyclicBarrier
- linux新增用户并增加sudo权限
- UpdateData
- Linux电源管理(5)_Hibernate和Sleep功能介绍
- Xpath 使用记录
- wamp下多域名配置问题
- hdoj1879继续畅通工程
- 数据结构实验之链表一:顺序建立链表
- 【翻译】各种Payload免杀工具集
- ITA扩围,中国软件公司感受到压力了吗?
- SQL data reader reading data performance test
- HDFS副本放置策略和机架感知
- 数据结构_选择排序
- C#开发COM组件
- 第一次写这个
- Ubuntu搭建Android开发环境
- 怎么在win10的系统上加域?win10加域两种方法介绍
- 欢迎使用CSDN-markdown编辑器
- openwrt: Makefile 框架分析