Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你一個串,只包含前kkk個字母和???,定義fif_ifi?表示第iii個字母在串中出現(xiàn)的最長連續(xù)長度,你現(xiàn)在需要將???替換為前kkk個字母,使得mini=0k?1fimin_{i=0}^{k-1}f_imini=0k?1?fi?盡可能大。
n≤2e5,k≤17n\le2e5,k\le17n≤2e5,k≤17
思路:
讓最小值盡可能大,我們可以考慮二分一個最小長度,讓后考慮怎么檢查答案呢?
假設(shè)二分的長度為midmidmid,可以發(fā)現(xiàn)問號拿出來之后一種有效方案每個連續(xù)段都涂一個色,所以如果我們能確定填字母的順序,那么就可以從頭掃這個串,讓后貪心的將問號變成當(dāng)前要變成的字母,當(dāng)然過程中要算上非問號的貢獻,一直到這個字母的長度=mid=mid=mid的時候停止,進行下一個要填的字母。
那么現(xiàn)在問題就變成了如何確定填字母的順序,有個顯然的方法就是k!k!k!枚舉,顯然過不去 。
考慮狀壓dpdpdp,為什么狀壓dpdpdp是可以確定順序的呢?考慮以下代碼:
由于我們不需要知道之前的數(shù)是怎么填的,只需要知道填完某幾個數(shù)之后填了前幾個字母,所以定義dp[i]dp[i]dp[i]表示填完了狀態(tài)iii之后最少用到了前dp[i]?1dp[i]-1dp[i]?1個字母。之后就可以枚舉狀態(tài)了,其中jjj就是當(dāng)前要填的數(shù),由于state>istate>istate>i,所以從小到大枚舉狀態(tài)不會漏掉狀態(tài)。
既然目前確定了順序且知道了從哪里開始填,如何確定當(dāng)前要填的數(shù)從當(dāng)前位置最近需要到那個位置才能使得其連續(xù)的長度≥mid\ge mid≥mid呢?由于狀壓dpdpdp復(fù)雜度已經(jīng)達到了2kk2^kk2kk,還有二分的復(fù)雜度,顯然不能在里面暴力求,所以考慮預(yù)處理。
定義f[i][j]f[i][j]f[i][j]表示第iii個字母從jjj開始最近到那個位置才能滿足條件,這個經(jīng)典的倒著處理,注意一下邊界就好啦。
復(fù)雜度O(nklogn+2kklogn)O(nklogn+2^kklogn)O(nklogn+2kklogn)
總結(jié)
以上是生活随笔為你收集整理的Educational Codeforces Round 111 (Rated for Div. 2) E. Stringforces 二分 + 状压dp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 口袋妖怪 黑白2攻略
- 下一篇: Codeforces Round #73