题意:给定一个有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
HDU 5371题意:定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称。
现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度。思路:来自官方题解:修正了一些题解错别字(误
先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中
要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部...
分类:
其他好文 时间:
2015-08-11 23:35:47
阅读次数:
464
【题目】给定一个字符串str,返回str中的最长回文子串的长度。【举例】str=“123”。其中的最长回文子串“1”或者“2”或者“3”,所以返回1。str=“abc1234321ab”。其中的最长回文子串“1234321”,所以返回7。【要求】如果str长度为N,时间复杂度为O(N)。题目分析:1...
分类:
编程语言 时间:
2015-08-11 21:17:51
阅读次数:
153
O(n)回文子串算法注:转载的这篇文章,我发现下面那个源代码有点bug。。。在下一篇博客中改正了。。 这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法.原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear...
分类:
编程语言 时间:
2015-08-11 20:45:30
阅读次数:
123
容易联想到利用manacher算法获得len数组,然后枚举第二段的长度判断能否和第三段对应上,能的话就更新答案。另外枚举长度的时候,小于等于当前答案的长度就没有必要枚举了,不然可能会超时。 1 #include 2 #include 3 #include 4 using namespace s...
分类:
其他好文 时间:
2015-08-11 20:44:16
阅读次数:
108
//给一个序列,让求其最大子序列
//这个序列由三段组成,第一段和第二段对称,第一段和第三段一样
//manacher算法求得p[i]
//枚举第二段的起点和长度,得到结果
#include
#include
#include
using namespace std ;
const int maxn = 2e5 + 10 ;
int str[ma...
分类:
编程语言 时间:
2015-08-11 18:43:18
阅读次数:
131
题目:
在一个长度为n的数组里面找回文串,要求回文串从中间向两边一次递减
思路:
manacher算法:时间复杂度O(n)
在manacher过程中添加限制语句保证题目要求即可
st[i-p[i]]st[i-p[i]+2]///表示回文串的左侧部分,前面要比后面的小
代码:
#include
#include
#define MAXN 100010
using...
分类:
其他好文 时间:
2015-08-07 20:15:58
阅读次数:
103
前几天bestcode做到一道字符串的题目,需要O(n)的回文,正好看到网上的manacher算法,于是来学习一发
进入正题:
manacher算法
用法:一般用于求一个字符串的最大回文,操作过程中会记录以每个点为中心的回文半径,可用来进行其他操作
时间复杂度:O(n)
空间复杂度:记录字符串2*n,半径数组2*n
内容:
记p[i]为以i为中心的回文半径(a...
分类:
编程语言 时间:
2015-08-04 17:16:17
阅读次数:
194