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\) 的大小关系即可。

时间复杂度线性。

posted @ 2025-08-22 18:11  XiaoZi_qwq  阅读(10)  评论(0)    收藏  举报