$Manacher$ + 差分.
利用补集转化思想,求出回文子串的总对数 $-$ 不相交的回文子串对数就是答案.
先跑一遍 $Manacher$ ,得出每个位置的回文半径以及回文子串的总对数.
于是接下来只需要计算不相交的回文子串对数.
记 $f(i)$ 表示以位置 $i$ 开始的回文子串数目, $g(i)$ 表示以位置 $i$ 结尾的回文子串数目.
这可以在跑 $Manacher$ 时打差分标记计算出来.
每个实际位置 $i$ ,即是字母的位置 $i$ ,贡献为 $f(i)\cdot \sum_{j<i} g(j)$ ,枚举的时候记录一下 $g$ 的实际位置上的前缀和.
1 |
|