题目:
对于一个 $0/1$ 字符串,如果将这个字符串 $0$ 和 $1$ 取反后,再将整个串反过来和原串一样,就称作「反对称」字符串。比如 $00001111$ 和 $010101$ 就是反对称的,而 $1001$ 就不是。
现在给出一个长度为 $n$ 的 $0/1$ 字符串,求它有多少个子串是反对称的,注意这里相同的子串出现在不同的位置会被重复计算。
$n\le 5\times 10^5$
分析:
①显然,反对称字符串的长度一定是偶数。
因为若不是偶数,中间的那个数取反永远不会等于自己。
②若有串$S[x-l+1,\;x+l]$是反对称字符串,那么$\forall k \le l,\;S[x-k+1,\;x+k]$也是反对称字符串。
所以,我们可以直接二分$l$,然后使用$\rm Hash$判断字符串是否相等即可。
代码细节较多,我还没写出来。
原文地址:https://www.cnblogs.com/zhylj/p/9536516.html
时间: 2024-10-02 23:56:25