Loading

[题目总结]NOIP2020 T2 另类做法

[题目总结]NOIP2020 T2 另类做法

首先考虑字符串哈希,把 \((AB)\) 看做一个整体来枚举,向后判断是否相等就可以简单的暴力。那么边暴力边算 \((AB)\) 有多少个前缀 \(s'\) 使得 \(F(s')\le F(c)\) ,显然可以先预处理,然后树状数组边加边询问。

我们不妨考虑当前的 \((AB)\) 是字符串 \(s\) 前缀 \(T\) 。那么我们假设算出来一个 \(P\) ,是 \(T\) 最多能往后复制并且能匹配的个数。

知道这个之后,假设 \(T\) 足够大,我们想想 \((AB)^TC\) 的贡献和 \((AB)^{T-2}C'\) 是不是一样的?

image

首先,这个时候树状数组肯定是一样的。其次,我们想想:奇数个字符的个数。那么 \(ABAB\) 必然保证了出现在 \(A,B\) 中的每一个字符出现偶数次。也就是说 \(F(ed1)=F(ed2)\)

好,问题就很显然了。在想一想,\((AB)^{T-1}C'\)\((AB)^TC\) 并不一定一样,所以要分开贡献。换句话讲:\((AB)^T,(AB)^{T-2},(AB)^{T-4}……\) 的贡献可以一起算,它们的贡献都是一样的\(c1\)\((AB)^{T-1},(AB)^{T-3},(AB)^{T-5}……\) 的贡献可以一起算,它们的贡献都是一样的 \(c2\)。所以总贡献是

\[\lfloor \dfrac{P+1}{2} \rfloor\cdot c1+\lfloor \dfrac{P}{2} \rfloor\cdot c2 \]

如果能快速处理出这个 \(P\),我们就可以 \(O(\log 26)\)\(c1,c2\) 从而 \(O(n\log 26)\) 做完。关键是怎么算 \(P\) ,这是这个方法的精髓。

显然可以二分一个 \(mid\) ,然后判断 \(mid\) 合不合法。我们再考虑字符串哈希,\(mid\) 合法当且仅当,如果说当前前缀的hash值为 \(a\) ,前缀 \(i\cdot mid\) 的哈希值为\(b\),那么是满足 \((\underbrace{\overline{aa\cdots a}}_{mid个})_{Base}=b\)

左边那个实际上是:\(a\cdot ((Base^{i})^{mid-1}+(Base^{i})^{mid-2}+\cdots + (Base^{i})^{0})\) 。令 \(base=Base^{i}\),就是 \(a\cdot (base^{mid-1}+base^{mid-2}+\cdots +base^{mid-1})\)。后面的显然等比数列求和。变成:

\[\dfrac{a\cdot (base^{mid}-1)}{base-1} \]

这个有除法,不好做,那么让 \(b\) 乘上 \(base-1\) ,再和分子判断就好了。

posted @ 2024-01-18 07:14  小铭同学lym  阅读(10)  评论(0)    收藏  举报