目錄manacher演算法 可在 \(o(n)\)的時間內求出乙個字串以每個位置為中心的最長回文子串。
原理:根據之前預處理出的回文串長度求得新的回文串長度
我們可以通過在字元中加上'#'來避免長度為偶數回文串沒有中心的問題
原串 = "abcd"; 變為
新串 = "#a#b#c#d#";
原串中長度為奇數和偶數的回文串的長度均變為奇數,且原串中回文串的長度為新串回文串半徑減一。
設定兩個狀態 $\max $ 和 \(p\) , \(p\) 表示當前已找到的回文串中,向右延伸最遠的中心位置,$\max $ 表示其右端點。
設 \(r(i)\) 表示(新串中)第 \(i\) 個位置的回文半徑(回文串長度的一半,包括第 \(i\) 個字元)按從左到右的順序求解,列舉到第 \(i\) 個字元時,分三種情況考慮:
設\(\ j\) 為\(\ i\) 關於 \(p\) 的對稱點,即 \(j = 2p - i\)
\(\max < i\),即向右延伸最遠的回文子串(黑色)沒有覆蓋 \(i\),此時只有 \(r(i) \geq 1\)。
\(\max \geq i\) 且 \(\max - i \geq r(j)\),即向右延伸最遠的回文子串(黑色)覆蓋了 \(i\),並且以 jj 為中心的最長回文子串完全與以 \(i\) 為中心的最長回文子串對稱(藍色),此時一定有 \(r(i) = r(j)\),即 \(r(i) \geq r(j)\)。
\(\max \geq i\) 且 \(\max - i \geq r(j)\),即向右延伸最遠的回文子串(黑色)覆蓋了 \(i\),但沒有覆蓋以 jj 為中心的最長回文子串的對稱位置串,所以 \(r(i)\) 只能取被覆蓋的(黃色)一部分,即 \(r(i) \geq \max - i\)。
int len;
void prepare()
s2[++len] = '#';
}void manacher()
}ans = max(p) - 1;
//原串回文串長度等於新串回文半徑減一.
manacher 學習筆記
部分內容 因為剛開始學,所以有些可能講解的不是特別好。manacher演算法 民間稱馬拉車演算法233 是用來找字元 串中的最長回文子串的,先來說一下什麼是回文串,像這樣 abcba 這樣乙個字串找到乙個中間位置,然後分別向他的左邊和右邊相等的距離位置的字元是相同的,那麼這個字串就稱為回文串,abc...
學習筆記 Manacher演算法
manacher 中文 馬拉車 演算法,即求解給定字串中最長回文子串長度的演算法。洛谷p3805 給出乙個長度為 n 的只由小寫英文本元 mathtt 組成的字串 s 求 s 中最長回文串的長度 一般情況下回文串有奇偶分類。為了避免分類,我們在字串中間新增特殊字元 不妨用 在串的首尾加上不同的特殊字...
學習筆記 manacher演算法
一.關於manacher manacher演算法用於求解乙個字串的回文子串半徑長度。它可以線性地求解對於字串中的每乙個字元,以它本身為中心的最長回文串的半徑。而且這個回文串的每乙個以這個字元為中心的子串都是回文串。這個演算法的時間複雜度為o n 二.回文子串長度的奇偶性帶來的問題。當乙個回文串長度是...