$Manacher$ + 差分维护数列.
首先将字符串添加特殊字符,利用 $Manacher$ 算法求出每个位置的回文半径 $R(i)$ .
维护一个 $cnt(i)$ 表示原串中长度为 $i$ 的回文串数目.
由于只考虑奇回文串,所以枚举时只处理字母作为回文中心的贡献.
若第 $i$ 个位置是字母,则它在原串中对应的奇回文串的长度分别是 $1,3,5,\dots,R(i)-1$ .
给 $1\sim R(i)-1$ 的所有 $cnt$ 都 $+1$ ,可以用差分来维护.
最后统计答案时,从大到小枚举长度,只将奇数长度计入贡献.
时间复杂度 $O(n\log n)$ .
1 |
|