
https://maguinta.github.io/https://maguinta.github.io/
contents
Problem
找到迴文是起頭和結尾都是字符 c,並且 c 在中間出現 X 次
參考範例輸入,六個詢問 (a, 2) (b, 2) (c, 2) … 他把字符弄再一起,例如第一個 (a, 2) 來說,起頭為 a 且中間要出現恰好 2 次 a,主字串中只看到 abccba 和 aa。
Sample Input
|
|
Sample Output
|
|
Solution
因為要恰好 X 個,對於每組詢問基本上只會有 n 個位置,當作起頭,然後 O(1) 檢查迴文即可。就算分 26 組下去,還是 TLE。
O(1) 檢查的方式按照 manacher’s algorithm 的做法,
manacher’s algorithm 算法核心,在 O(n) 時間內找到最長迴文子字串。
圖片與算法來源 here
可以將每組詢問壓到 O(log n) 以下,我們知道從每一個中心展開的最長迴文,也代表可以記錄展開的時候,恰好以某個字符開頭的最大總數。
對於每一組詢問,保證每一個中心最多當過一次迴文中心,因此只要總數大於等於指定個數,保證可以湊出來。
其 A[i][c] 表示以位置 i 為中心,起頭是字符 c,出現最多的 c 個數。之後問 c x 輸出有多少 A[i][c] >= x。
|
|






近期评论