Manacher演算法 最長回文串

2022-09-03 01:33:09 字數 1065 閱讀 3195

若字串長度為n,則演算法的時間複雜度為o(n)

假設有乙個字串abaaba

先把該字串變成$  #  a  #  b  #  a  #  a  #  b  #  a  #

第乙個字元設為『$』,防止計算的時候陣列越界

再計算p陣列,先給出p陣列的答案

i為座標,ma陣列放改變後的字串,p陣列代表以該字元為中心,向右和向左延伸p[i]個,是回文串

i       0  1  2  3  4  5  6  7  8  9  10 11 12 13

ma   $  #  a  #  b  #  a   #  a  #  b   #   a   #

p      1  1  2  1  4  1  2   7  2  1   4  1   2   1

附上完整**

1 #include 2

3using

namespace

std;

45 typedef long

long

ll;6

const

int maxn = 110000;7

char ma[maxn*2];8

int p[maxn*2];9

10void manacher(char *s,int

len)

18 ma[l] = 0;19

int mx = 0,id = 0;20

for(int i = 0; i < l; i++) 27}

28}29int

main()

42return0;

43 }

下列這圖是盜用別人的,這張圖很好詮釋了p[i] = mx > i ? min(p[2*id - i],mx - i) : 1;

j = 2*id - 1; p[j] 已經算出來了,又因為id向左向右延伸mx都是回文的,所以p[i] == p[j] (在滿足小於 mx - i 的情況下)

Manacher最長回文串演算法

在介紹演算法之前,首先介紹一下什麼是回文串,所謂回文串,簡單來說就是正著讀和反著讀都是一樣的字串,比如abba,noon等等,乙個字串的最長回文子串即為這個字串的子串中,是回文串的最長的那個。一.通常解決的問題 給定乙個字串,求出其最長回文子串。例如 1 s abcd 最長回文長度為 1 2 s a...

manacher演算法(最長回文串)

題目解釋 子串 小於等於原字串長度由原字串中任意個連續字元組成的子串行 回文 關於中間字元對稱的文法,即 aba 單核 cabbac 雙核 等 最長回文子串 1.尋找回文子串 2.該子串是回文子串中長度最長的。首先要知道這個演算法是用來在o n 的時間裡看乙個字串的最長回文子串的長度是什麼。其次,它...

最長回文字串(manacher演算法)

資料 網路 參見 問題描述 輸入乙個字串,求出其中最大的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。解析 這裡介紹o n 回文子串 manacher 演算法 演算法基本要點 首先用乙個非常巧妙的方式,將所有可能的奇數 偶數長度的回文子...