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奇數長度的字...