【做题记录】万径人踪灭

  • \(\text{P4199}\) 万径人踪灭

    • 算法:\(\text{FFT,manacher}\)

题目:

在一个只包含 \(a,b\) 的字符串中选择一个序列,使得

  1. 位置和字符都关于某条对称轴对称。

  2. 不能是连续的一段。

求有多少个满足要求的序列,答案对 \(1e9+7\) 取模。

\(n\le 10^5\)

题解:

upd:修改了部分内容。

首先枚举对称轴,假设我们以 \(k\) 为对称轴。

\(p_k\) 为满足 \(i<j,a_i=a_j\) 并且 \(i,j\) 关于 \(k\) 对称的 \((i,j)\) 的个数。

那么对于这 \(p_k\)\((i,j)\)\(a_i\)\(a_j\) 要么同时选(因为对称所以必定满足),要么同时不选,共 \(2^{p_k}\) 种方案。扣掉空集,共 \(2^{p_k}-1\) 种。

\[\therefore ans=\sum\limits_{k=0}^{n}2^{p_k}-1 \]

注意一下这里 \(k\) 可以为 \(\dfrac{t}{2}(t\in \mathbb{N})\),因为对称轴可以为两个字符中间(比如 \(1,8\) 就关于 \(4.5\) 对称,也就是 \(4,5\) 的中间对称)

这里有个关于位置对称的性质:

\(i,j\) 关于 \(p\) 对称当且仅当 \(i+j=2x\)

我们可以根据这个转移。

现在位置对称了,还要满足字符对称。

记字符 \(a\)\(1\),字符 \(b\)\(0\)

那么可以发现当两字符相等时仅可能为 \(1+1=2(aa)\)\(0+0=0(bb)\)。而对于 \(1+0=1(ab)\) 的情况则需要排除。

由于 \(aa\)\(bb\) 的情况的数值中间相差了 \(ab\),难以判断是否对称。

这里有个很好用的东西:平方。

平方可以消去数值的负号。

所以我们可以将 \(aa,bb,ab\) 所代表的数值各消去 \(1\) ,那么变为 \(1,-1,0\);此时再将它们都平方,那么对称的即变为 \(1\),不对称的还是 \(0\),很好地满足了我们的要求。

\[\therefore p_{k}=\sum\limits_{i+j=2k}(a_i+a_j-1)^2 \]

非常显然的卷积,\(\text{FFT}\) 一卷即可。

但题目中还说“位置不能连续”,说明要扣掉连续的回文子串的个数。

对于回文的对称的子串显然,用 manacher 一弄就好了。

posted @ 2022-01-07 19:33  trsins  阅读(27)  评论(0编辑  收藏  举报