$\newcommand{qed}{\square}$字符串神題。
要點:Lyndon分解,擴展KMP, 最小循環表示,貪心。
題目鏈接
題意
已知字符串 $S$, 請你把它切成不超過 $k$ 段,並翻轉其中若干段,使得最終字符串的字典序最小。
題解
先想一想如果 $k=|S|$, 即不限制切的段數怎么做。此時我們發現可以去掉“是否翻轉”的決策,因為如果有一段不翻轉,我們就把它拆成若干個單字符分別翻轉。
我們的策略是:
策略1. 設反串 $S^r$ 的Lyndon分解為 $s_1, s_2, \ldots, s_n, t_1, t_2, \ldots, t_m$, 其中 $s_n \ne t_1=t_2=\cdots=t_m$. 每次取出 $t_1 t_2 \cdots t_m$ 對應的原串前綴 $S[:L]$ 作為第一段,余下的化歸為關於 $S[L:], k-1$ 的問題。
證明 簡化問題的操作等價於每次剪切出一個反串的后綴,按剪切的順序先后從左到右連接。因此我們應該使最小后綴,即 $t_1$ 在開頭出現盡可能多次。$S^r$ 可以寫成 $A_1(c_1 \times t_1)A_2(c_2 \times t_1) \cdots A_t(c_t \times t_1)$ 的形式,$c_t=m$. 那么最優情況下應該使 $c_t+\max\{c_1+c_2+\cdots+c_{t-1}\}$ 個 $t_1$ 作為先導。為取到該最大值,最優策略應該先切出最后的 $m$ 個 $t_1$.
$\qed$
於是簡化的問題得到解決。想一想原問題,我們仍然假設每一段都必須翻轉,並加入修正規則:如果連續若干個段都是單字符,它們實際上只占據一段。
當 $k\ge3$ 時,策略1改進后也成立:
策略1-改. 設反串 $S^r$ 的Lyndon分解為 $s_1, s_2, \ldots, s_n, t_1, t_2, \ldots, t_m$, 其中 $s_n \ne t_1=t_2=\cdots=t_m$ 或者 $|s_n|>|t_1|=|t_2|=\cdots=|t_m|=1$. 每次取出 $t_1 t_2 \cdots t_m$ 對應的原串前綴 $S[:L]$ 作為第一段,余下的化歸為關於 $S[L:], k-1$ 的問題。
證明 如果 $|t_1| \ge 2$, 由於 $k \ge 3$, 策略1的證明仍然有效。如果 $|t_1|=1$, 那么為了節省段數一定一並取出這些單字符。
$\qed$
先對 $k \ge 3$ 的情況反復應用策略1-改,所以現可不妨假設 $k \le 2$.
如果 $S^r$ 已經是Lyndon串,那么顯然答案就是 $S^r$; 如果 $k=1$, 那么顯然答案就是 $\min\{S, S^r\}$.
處理完上述兩種情況,現在,字符串將被我們分為前后兩部分,並按照這兩部分是否翻轉分為三大類操作,或者不操作直接留下 $S$.
(一)前一部分翻轉,后一部分不翻轉,設為 $S^r[L:]S[-L:]$.
設 $S^r$ 的Lyndon分解合並相等段后為 $S^r[:d_1], S^r[d_1:d_2], \ldots, S^r[d_{n-1}:d_n]$, 其中 $d_n=|S|$, 那么我們有結論:
性質1. 存在整數 $q \in [1, n]$ 使得 $L=d_q$ 為本情況的最優解之一。
證明 若 $L$ 不是Lyndon分解中兩相鄰字符串的分界點,那么取它之后的一個分界點作為 $L$ 更優;若 $L$ 是兩相等字符串的分界點,分類討論可發現此相等段的兩端點中至少有一個是不會更劣的決策。
$\qed$
性質2. 如果設 $p$ 為最大的小於 $n$ 的正整數,滿足 $S^r[d_p:]$ 不為 $S^r[d_{p+1}:]$ 的前綴,特別地,若不存在如此的正整數則設 $p=0$, 則 $q>p$.
證明 此命題等價於 $\forall q<i \le n$, $S^r[d_i:]$ 為 $S^r[d_q:]$ 的前綴。否則取 $d_i$ 更優。
$\qed$
性質3. $\forall p<i<n,$ $d_{i+1}-d_i>|S|-d_{i+1}$. 這表明枚舉查找 $p$ 的時間為 $O(|S|)$.
證明 假設性質不成立,得 $S[d_i:]$ 有長度為 $d_{i+1}-d_i>{1\over2}(|S|-d_i)$ 的周期,矛盾。
$\qed$
性質4. 當 $p<m \le n$ 時,設 $T_m=S^r[d_m:]S[-d_m:]$, 若 $T_{m-1}>T_m$, 則 $\forall p<i<m, T_i>T_m$.
證明 $\because T_{m-1}>T_m$, $T_m[-d_{m-1}:]=T_{m-1}[-d_{m-1}:]$
$\therefore T_m[:-d_{m-1}]<T_{m-1}[:-d_{m-1}]=S^r[d_{m-1}:]=T_i[:-d_{m-1}]$
$\therefore T_m<T_i$.
$\qed$
因此只需要枚舉找到最大的整數 $q$ 使得 $q=p+1$ 或 $S^r[d_q:]S[-d_q:]<S^r[d_{q-1}:]S[-d_{q-1}:]$, 后者等價於 $S[-d_{q-1}:-d_q]<S^r[d_{q-1}-d_q+|S|:]$, 因此直接比較的總時間也是 $O(|S|)$.
(二)前一部分不翻轉,后一部分翻轉,設為 $S[:L]S^r[:-L]$.
設 $i<j$, 比較 $S[:i]S^r[:-i]$ 與 $S[:j]S^r[:-j]$ 實際上相當於比較 $S^r[:-i]=S^r[:j-i]S^r[j-i:-i]$ 與 $S^r[i:j]S^r[:-j]$, 於是可以考慮用擴展 $KMP$ 算法求這兩個串的最長公共前綴以比較大小。
(三)兩部分都翻轉,即 $S^r$ 的循環表示。求最小循環表示即可。
綜上所述,本題可以在 $O(|S|)$ 時空內解決。