https://www.luogu.com.cn/problem/AT_arc077_d
我们设 Ti 表示 fi(S) 的前一半,例如输入的 S=S′S′,则 T0=S′。
设 B(T) 表示 T 最长的不为自身的 border,则容易证明 Ti=Ti−1Ti−1−B(Ti−1),这里减法表示去除一个后缀。
我们证明如下结论:
- 如果 S′ 存在整周期,设其中最小的为 Xk=S′,因为如果存在整周期,则最小周期一定为最小整周期,于是 Ti=Xk+i。
- 如果 S′ 不存在整周期,设 Ti−1=S′−B(S′),则有 ∀≥1, Ti=Ti−1Ti−2, Ti−2=B(Ti)。
我们归纳证明第二种情况:
对于 i=1 由定义可知第一部分成立。
当 i=k 时第一部分成立时:
Ti−2 一定是 Ti=Ti−2Ti−3Ti−2 的一个 border,我们只需要证明它是最长的,否则设最长 border 为 C,如果 ∣C∣>∣Ti−2Ti−3∣,则 Ti 有长度小于 Ti−2 的周期,则它的前缀 Ti−1=Ti−2Ti−3 有长度超过 Ti−3 的 border,与假设矛盾。
如果 ∣Ti−2∣<∣C∣≤∣Ti−2Ti−3∣,设 C=Ti−2A,则 A 是 Ti−3 的前缀,所以它也是 Ti−2 的前缀,也就是 C 的 border,而 Ti−2 也是 C 的 border,因为 ∣C∣−∣A∣+∣C∣−∣Ti−2∣=∣C∣,所以由弱周期引理得 C 的长度为 gcd(∣C∣−∣Ti−2∣,∣C∣−∣A∣)=gcd(∣A∣,∣Ti−2∣) 的前缀 D 也为 C 的周期,于是这也为 C 的前缀 Ti−2 的整周期,设 Ti−2=Dj,则 Ti−1=Dj+1, Ti=D2j+1=Dj+2,所以 j=1,这样 gcd(∣A∣,∣Ti−2∣)=∣Ti−2∣,与假设矛盾,于是 i=k 时第二部分成立。
当 i=k 时第二部分成立时:
Ti+1=TiTi−B(Ti)=TiTi−Ti−2=TiTi−1,即 i=k+1 时第一部分成立。
在 i=1 时可能会因为涉及到 T−2 产生一些问题,不过可以利用 S′ 没有整周期的性质单独说明。
于是证明完毕。
所以如果 S′ 存在整周期可直接计算,否则答案可以拆成 O(logn) 个 Fi,其中 i 是 O(logn) 级别的和,直接暴力计算 Fi 里边每个字符的数量即可。