1. 程式人生 > >Gym 101612B Consonant Fencity

Gym 101612B Consonant Fencity

nload force 統計 就是 icpc attach pdf cpc tro

原題傳送門

題意:給定一個只含小寫字母的字符串,假設aeiouyw為元音字母,現在要把一些字母變為大寫,要求相同字母的大小寫必須相同,統計變化後的字符串中有多少對相鄰同為輔音字母大小寫不一樣的字符對,輸出能這樣的字符對數量最大的字符串。字符串長度≤106

分析:初讀題,106的確嚇了我一跳:這道題不像是有線性解法的樣子。但只要仔細讀題,看到相同字母的大小寫必須相同這個條件,就不難發現其實106只是表象,真正有用的是字母——只要枚舉字母的大小寫情況,字符串多長根本不用在意。當然也不是真的不在意,考慮到相鄰的字符對至多只有106種,我們完全可以預處理,將這些字符對的關系存在一個26*26的數組sum裏,其中sum[i][j]表示左邊為i,右邊為j的字符對的數目,這樣利用狀態壓縮(不是狀壓DP。。),可以在預處理106

和主程序226*262的時間復雜度內求解,但是看起來不夠?題目已經貼心地為我們準備了大餐——首先有7個元音字母,也就是說枚舉的狀態不會大於219,這就差不多夠了。出題人還生怕卡掉常數大的正解,將時限設為3s。一句話,想出正解沒有TLE的理由。

註意幾個細節:為了能方便枚舉219個狀態,建議將26個字符中的輔音字母與0-18進行一一對應,最後輸出時再將狀態轉化回來,這樣避免了表面枚舉219,實際上枚舉226的尷尬。但是這樣帶來了一個問題(至少對我來說是個問題),那就是對應數組的使用有很多細節要註意,一不留神就會將下標錯開一位,導致整個字符串就不對了。

代碼

Gym 101612B Consonant Fencity