题意:
定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称。
如今给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度。
思路:
来自官方题解:修正了一些题解错别字(误
先用求回文串的Manacher算法。求出以第i个点为中心的回文串长度。记录到数组p中
要满足题目所要求的内容。须要使得两个相邻的回文串,共享中间的一部分,也就是说。左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样。 由于我们已经记录下来以第i个点为中心的回文串长度, 那么问题能够转化成,相距x的两个数a[i],a[i+x],满足p[i]/2>=x 而且 p[i+x]/2>=x。要求x尽量大
这能够用一个set维护。一開始集合为空,依次取出p数组中最大的元素。将其下标放入set中,每取出一个元素,在该集合中二分查找比i+p[i]/2小,但最大的元素。更新ans。
然后查找集合中比i-p[i]/2大,但最小的元素,更新ans。
答案就是3*ans
嗯~事实上不用二分暴力扫下也能水过去
/** @author FreeWifi_novicer* language : C++/C*/#include #include #include #include #include #include #include #include