$Manacher+FFT$ .
考虑去掉第 $2$ 个限制,即允许选出的位置连续,算出所有的数目后再减去连续的数目.
连续的数目即回文串的数目,可以利用 $Manacher$ 求出,顺便填充间隔字符,便于下面的处理.
为了计算前者,可以考虑每个位置作为回文中心的贡献,若有 $x$ 对字符关于 $i$ 对称,则 $i$ 的贡献为 $2^x-1$ .
而两个相同的字符,若位置分别为 $j,k$ ,则它们关于 $(j+k)/2$ 对称.
分别计算字符 $a,b$ 的贡献,而贡献是一个卷积的形式,模数是 $P-1$ ,但系数不会超过 $n^2$ ,用 $FFT$ 优化.
注意当 $j\neq k$ 时,这对会贡献两次,需要简单处理一下.
时间复杂度 $O(n\log n)$ .
1 | //%std |