第一眼看以為是kmp,然後仔細一看是子串行,再看資料範圍,暴力的話肯定會超時,所以這道題需要用動態規劃來寫,令 f[i][j],(j = 1,2,3,4) 表示前 i 個字元中,匹配了字串」cwbc」 的前多少位,那麼有轉移方程:
f[i][1] = (f[i−1][1] + (s[i] ==′ c′)) % mod
f[i][2] = (f[i−1][2] + (s[i] ==′ w′)∗f[i−1][1]) % mod
f[i][3] = (f[i−1][3] + (s[i] ==′ b′)∗f[i−1][2]) % mod
f[i][4] = (f[i−1][4] + (s[i] ==′ c′)∗f[i−1][3]) % mod
但是陣列的開小大概需要 35mb 左右,會超過記憶體限制,所以還需要優化一下。
容易發現,每乙個字元的狀態都只從它前乙個字元的狀態轉移過來,顯然我們可以考慮使用滾動陣列來優化空間開銷。我們考慮去掉第一維的狀態,只保留第二維的狀態。那麼轉移方程就變為:
f[1] = (f[1] + (s[i] ==′ c′)) % mod
f[2] = (f[2] + (s[i] ==′ w′)∗f[1]) % mod
f[3] = (f[3] + (s[i] ==′ b′)∗f[2]) % mod
f[4] = (f[4] + (s[i] ==′ c′)∗f[3]) % mod
同乙個位置有且僅有乙個字元,不難發現轉移方程間是不會相互影響的。因此,省去第一維的狀態
是正確的。
ac**:
#include #include #include #include #define ll long long
#define mod 2000120420010122
using namespace std;
string str;
ll dp[5];
int main()
cout<} return 0;
}
牛客小白月賽3 B 躲藏
傳送門 題目描述 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對2000120420010122取模後的結果。聰明的你在仔細閱讀題目...
牛客小白月賽3 B 躲藏
題目鏈結 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對 2000120420010122 2000120420010122 200...
牛客網小白月賽3 B 躲藏 簡單DP
b 躲藏 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對2000120420010122取模後的結果。聰明的你在仔細閱讀題目後,一定...