馬拉車演算法

2022-07-06 01:09:09 字數 949 閱讀 2752

馬拉車演算法查詢 字串的最大回文子串。

其演算法本質上是中心擴充套件法。

中心擴充套件法

vectorv(strlen,0); //v[i] 是指以i為中心的回文字串長度的半徑

for (int i = 1; i < strlen - 1; i++)

while (str[i + 1 + v[i]] == str[i - 1 - v[i]]) ++v[i];//不考慮越界

而馬拉車利用回文的對稱性避免多餘的計算

核心演算法如圖所示

是的,最核心的就這個了。

剩下的是解決回文字串長度是奇數還是偶數(利用插入其它字元)

以及如何更新可利用的a點(當可利用的a點範圍比最新的 「a"點 要小時,就更新a點)

附poj 3974 ac**

int mlc(string &str) 

newstr.push_back('$');

int newlen = newstr.size();

vectorv(newlen,0);

int c = 0, r = 0;

for (int i = 1; i < newlen - 1; i++)

if (i + v[i] > r)

}int ret = 1;

for (int i = 1; i < newlen - 1; i++)

return ret;

}int main()

int len = mlc(str);

cout << "case " << ++idx << ": " << len << endl;

}return 0;

}

馬拉車演算法

思路筆記 上述情況1和情況2又可以歸結為 i 的回文半徑 和 r i的距離 中小的那個就是i的回文半徑。include include includeusing namespace std string manacherstring string str return res int min int...

馬拉車演算法

馬拉車演算法是一種計算最長回文子串的演算法,以其優秀的線性複雜度聞名於世,相較於o n 2 o n 2 o n2 的dpdp dp演算法和會被特殊資料卡到o n 2 o n 2 o n2 的暴力演算法,馬拉車演算法無疑是求解最長回文子串的最優選擇。最長回文子串分為偶數串和奇數串,為了避免這些問題,馬...

馬拉車演算法

manacher char s maxn 1 int n,hw maxn 1 int l maxn 1 r maxn 1 void manacher char a n len 2 2 s n 0 int maxr 0,m 0 for int i 1 i n i manacher 題意在給定的字串中找...