hdu3098 最长回文(manacher算法)
来源:互联网 发布:百度软件市场 编辑:程序博客网 时间:2024/06/07 00:55
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaaabab
Sample Output
43
代码:
#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;}
0 0
- hdu3098 最长回文(manacher算法)
- MANACHER最长回文算法
- 最长回文字符串(manacher算法)
- 最长回文字串-manacher算法
- 【Manacher算法】hdu3068 最长回文
- Manacher算法求最长回文
- HDU3068最长回文 Manacher算法
- hdu3068 最长回文--Manacher算法
- Manacher算法(最长回文串)
- 最长回文字符串--manacher算法
- 最长回文字符串 manacher算法
- 最长回文字串(Manacher算法)
- 最长回文字串--Manacher算法
- manacher算法(最长回文字符串)
- 最长回文(Manacher算法)
- 最长回文字符串 manacher算法
- 最长回文字串--MANACHER算法
- 最长回文字串Manacher 算法
- DataTable添加行出现“该行已经属于另一个表”的错误!
- 九度oj 1111
- JAVA并发编程之 CyclicBarrier
- C++ 标准输入流总结
- ASP.NET MVC学习小记
- hdu3098 最长回文(manacher算法)
- addView(View,index) 用法
- poj解题报告——2505
- 基于Java的socket对文件的传输
- 机房收费——Excel打开调整与注册控件的实现
- URAL2048 History
- 前端组件,希望以后大家都能自己搭建完整的项目
- 【Java解析XML】【二】JDK中的XML解析操作
- request详解之URL