a. 【美團杯2020】查查查樂樂
「查查查樂樂」是一段古老神秘的咒語,只有被選中的魔法師才有資格使用這一段咒語並享用它所帶來的力量;而如果這段咒語出現在了不具資格的魔法師的口中,這個魔法師將會遭到咒語的反噬並付出可怕的代價。
這個學期,鎂團在一家魔法早教學校做兼職,他的任務是教小學生們魔法並幫助他們準備一年一度的全國魔法奧林匹克競賽 (nomp)。今天,鎂團在整理圖書的時候,突然發現一本課外教材中包含了 t 段只由查和樂組成的咒語。讓小學生們閱讀這些咒語是非常危險的:他們可能會在無意識中唸出「查查查樂樂」。
因此,作為一名富有責任心的兒童教師,鎂團打算修改這些咒語,從而最大程度地杜絕這方面的隱患。鎂團認為一段由查和樂組成的咒語是危險的當且僅當在刪去咒語中的若干個字(也可以不刪)後,剩下的咒語可能變成查查查樂樂。舉例來說,「查查查樂樂」,「查查樂查樂樂」 就是危險的,而 「樂樂查查查」,「樂查樂樂查樂查查」就不是危險的。
對於每一段咒語,鎂團都可以選擇若干個位置並對這些位置進行修改:他可以把「查」變成「樂」,也可以把「樂」變成「查」。為了最大限度地保留教學效果,鎂團希望使用盡可能少的修改來消除所有的危險性:對於每一段咒語,鎂團都希望你幫他計算一下最少的修改次數。
輸入格式
輸入第一行是乙個整數 t(1≤t≤1000),表示咒語的數量。
對於每組資料,輸入包含一行乙個只包含字元 x 和 l 的字串 s(1≤|s|≤100),描述了一段咒語。其中 x 表示「查」,l 表示 「樂」。
輸出格式
對於每段咒語,輸出一行乙個整數表示最少的修改次數。
樣例一input
3***ll
xxlxllllxl
***xxlllll
output11
3explanation
對於三段咒語,我們分別給出一種讓修改次數最小的方案:
xxlll,修改了第 3 個字。
xxllllllxl,修改了第 4 個字。
xxllllllll, 修改了第 3,4,5 個字。
限制與約定
small task: n≤10
large task: n≤100。
時間限制:2s
空間限制:512mb
思路:
題目的意思是給我們乙個序列,讓我們要修改一些字元,使這個序列不存在***ll的子串行
我們定義乙個dp陣列表示當前的修改次數
dp[1]表示不存在x序列的修改次數
dp[2]表示不存在xx序列的修改次數
dp[3]表示不存在***序列的修改次數
dp[4]表示不存在***l序列的修改次數
dp[5]表示不存在***ll序列的修改次數
這樣dp陣列的初始值都為0
我們在遇到x的時候,不能出現的序列是x,xx,***,這時我們可以修改當前的x,也可以修改前i-1個的x,這樣都不能構成***ll序列,修改次數就有dp[1] = dp[1] + 1,由於要求最小值,所以dp[2] = min(dp[1],dp[2] + 1),同理dp[3] = min(dp[2],dp[3] + 1)
我們在遇到l的時候,前面不能出現的序列是***l和***ll,同理可以修改當前的l,也可以修改l之前的x,所以dp[4] = min(dp[3],dp[4] + 1),同理dp[5] = min(dp[4],dp[5] + 1)
這樣dp方程就出來了,只需要在for迴圈中判斷當前的字元是x還是l即可
int dp[6]
;char s[
101]
;int
main()
else
}printf
("%d\n"
,dp[5]
);}return0;
}
美團杯2020 半字首計數
題意 定義半字首是 s 1 i s j k s 1 i s j k s 1 i s j k 其中 0 i n s i len s j 1 k len s 0 i0 in s ilen s j 1 k len s 直觀上來說,你可以把半字首理解成某乙個字首 s 1 k 刪除掉某乙個子串後形成的結果 當...
美團杯2020 半字首計數 字尾自動機
題目大意 蒜斜剛來pku的時候還不知道有 北大算協 這個社團,因此他總是覺得周圍的人在偷偷議論著他,比如說 算協 注 非蒜斜 舉辦的活動好有趣啊!算協 注 非蒜斜 好帥啊!蒜斜每次聽到這些話就會想入非非,但仔細想想,自己好像也沒有那麼帥吧?最離譜的一次還是 算協 注 非蒜斜 有好多小哥哥 霧 自從蒜...
美團杯2020 平行四邊形 原根
蒜斜非常喜歡下圍棋。自從alphaog面世以來,他就立志一定要研究出alphaog的破綻。終於,他發現當alphaog遇到一種特殊局面後,它的神經網路會自動輸出 投降 隨著進一步的研究,蒜斜發現這種局面有著更一般的特性,不僅僅侷限於固定大小棋盤。具體來說,當棋盤大小是 n n 1 是乙個質數 且棋盤...