2011年就能出出這樣充滿科技感+腦力的題,佩服POI Orz函數
簡記一下作法和證實,順便複習 border 的一些性質。code
注意真的是簡記,有不少東西須要本身好好推一下……遞歸
約定:字符串 $s$ 的下標從 $0$ 開始,$s_{i,j}$ 表示 $s$ 的第 $i$ 到第 $j$ 個字符構成的子串。ci
串 $s$ 有長度爲 $l$ 的週期等價於其有長度爲 $|s|-l$ 的 border。字符串
設函數 $solve(s)$ 表示字典序最小的、border 集合與 $s$ 的 border 集合相同的 $01$ 字符串。分爲如下狀況:it
1 和 2 狀況的構造是顯然的。io
對於 3 狀況,遞歸進入 $tt'$ 求解。設 $qq' = solve(tt')$,那麼就把 $q$ 重複若干次拼上 $qq'$,便可獲得答案。循環
在證實正確性前先來複習有關週期和 border 的幾個 OI 界衆所周知的簡單定理。gc
Proof. 設 $p < q$,令 $d = q - p$。由於 $p + q \leq |s|$,因此 $\forall i \in [0,|s|-1] , i - p \geq 0$ 和 $i+q < |s|$ 至少有一個成立,故能夠先向後跳 $q$ 再向前跳 $p$,或者先向前跳 $p$ 再向後跳 $q$,可得 $s_{i+d} = s_i$。那麼 $q-p$ 也是 $s$ 的週期。根據展轉相除法,$\gcd(p,q)$ 也是 $s$ 的一個週期。QED
qq
Proof. 首先這些元素必定會包含在 border 集合內。考慮使用反證法證實不存在其餘的元素。
設有不知足該形式的 border 長度 $l'$,不妨設 $l' = xl+(|s| \bmod l)+y(y \in [1,l-1])$。那麼在 $s$ 的長度爲 $(x+1)l + (|s| \bmod l)$ 的前綴中,$l'$ 是它的一個 border,即 $l-y$ 是這個前綴的週期,而 $l$ 也是其週期,且由於 $x \geq 1$ 有 $(x+1)l + (|s| \bmod l) \geq 2l-y$,根據 Periodicity Lemma
有 $\gcd(l,l-y)$ 是這個前綴的週期,同時 $\gcd(l,l-y) \mid l$ 因此 $\gcd(l,l-y)$ 是原串的一個週期,與 $l$ 是 $s$ 的最短週期長度不符。QED
根據推論咱們能夠知道若是 $q$ 串不是滿週期串(便可劃分爲若干個部分知足各個部分的字符串徹底相同),那麼 $\geq |qq'|$ 的全部 border 均可以正確構造,而構造 $qq'$ 的時候將 $< |qq'|$ 的全部 border 都已經正確構造了,因此這樣就是對的。
證實 $q$ 不是滿週期串是簡單的:若是 $q$ 是滿週期串,不妨設 $q = p^c$,其中 $p$ 是一個字符串。那麼 $|qq'|-|p|$ 是 $qq'$ 最長的 border。而若是在原串中有這樣的一個 border 且 $q$ 是週期,那麼能夠當即導出 $p$ 是週期,那麼 $q$ 就不是最小週期。
先說句閒話:狀況 4 中全部利用 border 表示利用 border 導出的相等關係。充分利用相等關係是證實一些結論的關鍵。
對於 4 狀況,先遞歸進入 $s_{1,len}$ 求解。設 $t = solve(s_{1,len})$,那麼咱們須要肯定一個字典序最小的字符串 $a$ 知足 $s=tat$ 的最長 border 爲 $t$。
首先咱們確定但願 $a$ 是全 $0$ 的字符串。可是隻有這一種選擇顯然不能覆蓋全部的狀況,好比 $t = 0000$ 時這樣會使得最長 border 變大致使構造不合法。考慮在什麼狀況下以全 $0$ 串做爲字符串 $a$ 會致使不合法。不妨討論更長的 border 中最短的長度 $l$:
至此能夠得出將 $a$ 的最後一個 $0$ 換成 $1$ 獲得的串必定是合法的,而它顯然是最優的。
梳理一下 $solve(s)$ 的流程:
至於如何 check 全 $0$ 串是否合法,暴力 KMP 一遍便可。由 $T(n) = T(\frac{n}{2}) + O(n)$ 可得複雜度爲 $O(n)$。