题目地址:HDU 5371
题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列,该子序列分为三部分,第一部分与第三部分相同,第一部分与第二部分对称,如果存在求最长的符合这种条件的序列。
思路:用Manacher算法来处理回文串的长度,记录下以每一个-1(Manacher算法的插入)为中心的最大回文串的长度。然后从最大的开始穷举,只要p[i]-1即能得出以数字为中心的最大回文串的长度...
分类:
编程语言 时间:
2015-08-12 16:48:58
阅读次数:
158
manacher算法介绍
先用求回文串的Manacher算法,求出以第i个点和第i+1个点为中心的回文串长度,记录到数组c中 比如 10 9 8 8 9 10 10 9 8 我们通过运行Manacher求出第i个点和第i+1个点为中心的回文串长度 0 0 6 0 0 6 0 0 0
两个8为中心,10 9 8 8 9 10是个回文串,长度是6。 两个10为中心,8 9 10 10 ...
分类:
其他好文 时间:
2015-08-12 16:48:40
阅读次数:
286
http://acm.hdu.edu.cn/showproblem.php?pid=5340/*Manacher算法:O(n) 实现最长回文子串算法实现:先向原字符串中插入一个原来串不存在的字符,一般用'#',再O(n)遍历一遍,用一个数组p[i]来记录以str[i]为中心的回文半径(注意str[i...
分类:
编程语言 时间:
2015-08-12 16:41:34
阅读次数:
126
【POJ 3974】 PalindromeManacher纯模板题 忘记的时候可以拿来找感觉代码如下:#include
#include
#include
#include using namespace std;char str[1111111];
char nwstr[2333333];
int p[2333333];...
分类:
其他好文 时间:
2015-08-12 14:41:00
阅读次数:
118
题意:
给定一个有n个数字的序列,找出一个连续的子序列满足这样的条件:
1. 平均分成三段
2. 第一段与第三段一样
3. 第二段是第一段的倒序。求这样的子序列的最大长度。
数据范围:n~100000
解析:
我看网络上面很多的题解都是用O(n2/32)O(n^2/32)的做法水数据过去的,这种做法是先用mancher算法预处理出每个每个回文串最远所能抵达的位置,然后...
分类:
其他好文 时间:
2015-08-12 11:38:48
阅读次数:
119
题意:找三个连续子序列a b c,满足a b对称且b c对称
思路:先求出序列中以每个位置为中心的回文串长度存在p[i]数组里,用manacher算法,O(n)的时间,然后遍历p数组,如果在当前位置的回文串范围内,与之后的位置上的回文串范围能覆盖彼此任意一个的至少一半,就说明满足条件,依此找出最优解
还在wa的同学可以试试我代码下面的数据
代码:
#include
#include
#...
分类:
其他好文 时间:
2015-08-12 11:38:09
阅读次数:
128
【HDOJ 5371】 Hotaru’s problemManacher算法+穷举/setManacher算法一好文:http://blog.csdn.net/yzl_rex/article/details/7908259套一个Manacher算出回文半径数组p之后 有两种方法
穷举法:
枚举-1的点(根据题意只必为偶数回文) 找在该点回文半径内与其相隔最远 并且回文半径等于他俩距离(即两点为中...
分类:
其他好文 时间:
2015-08-12 11:37:23
阅读次数:
109
题意:给定一个有n个数字的序列,找出一个连续的子序列满足这样的条件:平均分成三段,第一段与第三段一样,第二段是第一段的倒序。求这样的子序列的最大长度。数据范围:n~100000
分析:
上面的条件抽象出来其实就是双回文串,所以题目就是求一个序列的最长双回文串。
主体做法是:
1.先用manacher算法O(n)求出每个元素的最大回文半径;
2.把每个元素看成一个圆心,那么两个点能构成双回...
分类:
编程语言 时间:
2015-08-12 06:45:23
阅读次数:
156
题意,给定一个100000 的串,求他一个子串,使得将子串分成三部分有后,第一部分=第三部分,第一部分与第二部分对称(回文)首先我们需要处理出以i为轴的回文串的两端,这个事情可以用Manacher算法完成,复杂度O(n)http://blog.csdn.net/ggggiqnypgjg/articl...
分类:
其他好文 时间:
2015-08-12 01:17:56
阅读次数:
102