求最長回文串 Manacher演算法

2021-07-24 03:35:18 字數 715 閱讀 5359

o(n)效率的字串求最長回文串,感覺這個blog上寫的很詳細:

有幾個要點:

1、先要將字串擴充套件成2*l+1長度的,在每兩個字元之間要加上乙個用不到的字元,比如『#』,方便處理偶數回文串。

2、在擴充套件後的字串兩端要加一些特殊字元,防越界。

3、ra[i]陣列表示以i為中點的最長回文串,mx表示以j(1<=j(證明ra[i]-1即為原字串的回文串的長度的證明:

**附上

#include#include#include#include#include#includeusing namespace std;

const int maxn=1000012;

char s[maxn];

char tmp[maxn<<1];

int ra[maxn<<1];

int init(char *st)

tmp[2*len+1]='#';

tmp[2*len+2]='$';

tmp[2*len+3]=0;

return 2*len+1;

}int manacher(char *st,int len)

ans=max(ans,ra[i]);

}return ans-1;

}int main()

return 0;

}

可以去hihocoder 1032交:

O n 時間求 最長回文子串 Manacher演算法

回文字串分為奇回文和偶回文,在字串中間插入任意字元使得串變成奇回文串 暴力思想 肯定是找乙個點往兩邊任意擴充套件,遍歷一次,manacher時間為o n 開乙個陣列p記錄 以點i為中點 的最長回文串的半徑,假設前i 1個點的p都已經求出來來,現在考慮p i 如何推導 重點 r是p 1 p i 1 中...

manacher演算法求最長回文串長度

manacher演算法 定義陣列p i 表示以i為中心的 包含i這個字元 回文串半徑長 將字串s從前掃到後for int i 0 i由於s是從前掃到後的,所以需要計算p i 時一定已經計算好了p 1 p i 1 假設現在掃瞄到了i k這個位置,現在需要計算p i k 定義maxlen是i k位置前所...

manacher演算法 O n 求最長回文子串

樸素的做法是求出以每個字元為中心的回文串長度,複雜度為 而manacher演算法可以在o n 時間內求解,奇數長度和偶數長度可以統一處理。根據回文串的對稱性,避免了大量不必要的比較。處理技巧 相鄰的字元之間插入乙個分隔符,串的首尾也要加,以 為例,則長度為n的字串經過處理之後變成2n 1奇數長度的字...