P4287 [SHOI2011] 双倍回文 解题报告
P4287 [SHOI2011] 双倍回文 解题报告
简要题意
给定一个字符串 \(s\),求出 \(s\) 中最长的子串,使得这个子串可以被分为两个相同的长度为非零偶数的回文子串(即可以被表示为\(tt^{-1}tt^{-1}\)。其中 \(t^{-1}\) 指 \(t\) 翻转后得到的字符串)。输出这个子串的长度。
数据范围:\(|s| \le 5 \times 10^5\)。
分析
首先,这个串自己就是一个回文串,因此我们只需要对 \(O(n)\) 个本质不同的回文串进行判断即可。
找出所有回文子串可以通过 Manacher 实现。
在 Manacher 中,我们在更新 \(mx\) 时,对新产生的回文子串进行判断。对于一个回文串 \(s\) ,我们可以在 \(O(1)\) 的时间内判断它是否是一个“双倍回文串”。
具体地,不妨假设目前正在处理 \(i\)( \(i\) 一定是一个“间隔”),得到的最长回文子串长度为 \(p_i\)。枚举每一个 \(3 \le j \le p_i(j \equiv 1 \pmod 2)\),那么有 \([i+1,i+j]=[i-j,i-1]\),如果\([i-j,i-1]\) 是一个回文串,那么 \([i+1,i+j,i-j,i-1]\) 就是一个"双倍回文串"。我们只需要判断 \(p_{i-(j+1)/2}\) 和 \((j+1)/2\) 的大小关系即可。
时间复杂度线性。

浙公网安备 33010602011771号