题解 P3526 【[POI2011]OKR-Periodicity】
同步发布于cnblogs
Updated On 2022.02.01:情况 4 细节添加,也算是解决了第一次做这个题的时候一些口胡上的疑惑
2011年就能出出这样充满科技感+脑力的题,佩服POI Orz
约定:字符串
串
设函数
- 如果
s 中所有字符相同,返回|s| 个0 构成的字符串; - 如果
s 周期集合为空,返回|s| - 1 个0 接上1 个1 构成的字符串; - 如果
s 最短的周期长度len 满足2len \leq |s| ,设t = s_{1,len} ,则s 可表示为ttt...tt' 的形式,其中t' 是t 的一个前缀,可为空。 - 如果
s 最短的周期长度len 满足2len > |s| ,设 border 为t ,那么s 就可以表示为tat 的形式,其中a 是一个任意字符串,不能为空。
1 和 2 情况的构造是显然的。
对于 3 情况,递归进入
在证明正确性前先来复习有关周期和 border 的几个 OI 界众所周知的简单定理。
- Weak Periodicity Lemma:对于一个字符串
s ,若其有长度为p 和长度为q 的周期,且p+q \leq |s| ,则s 有长度为\gcd(p,q) 的周期。
Proof. 设 QED
- 一个推论:设
s 最短周期长度为l ,且2l \leq |s| ,则s 的 border 集合中\geq l + (|s| \bmod l) 的元素一定构成集合\{pl + (|s| \bmod l) | p \in Z^+ , pl + (|s| \bmod l) \leq |s|\} 。
Proof. 首先这些元素一定会包含在 border 集合内。考虑使用反证法证明不存在其他的元素。
设有不满足该形式的 border 长度 Periodicity Lemma 有 QED
根据推论我们可以知道如果
证明
对于 4 情况,先递归进入
首先我们肯定希望
至此可以得出将
梳理一下
- 如果
s 中所有字符相同,返回|s| 个0 构成的字符串; - 如果
s 周期集合为空,返回|s| - 1 个0 接上1 个1 构成的字符串; - 如果
s 最短的周期长度len 满足2len \leq |s| ,将s 表示为ttt...tt' 的形式,其中t' 是t 的一个前缀,可为空,设qq' = solve(tt') ,则返回q^{\lfloor \frac{|s|}{len} \rfloor}q' ; - 如果
s 最短的周期长度len 满足2len > |s| ,设t = s_{1,len} , q = solve(t) 。检验t+000...000+t 的最长 border 是否为len ,若否将最后一个0 替换为1 ,然后将该串返回。
至于如何 check 全