//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
題意
在給定的字串中找到兩個相鄰的回文串,長度最長思路
將manacher處理後的"#"當作兩個回文串的連線點注意這個處理步驟:
l[i + hw[i] - 1] = max(l[i + hw[i] - 1], hw[i] - 1);
r[i - hw[i] + 1] = max(r[i - hw[i] + 1], hw[i] - 1);
還有這個步驟:
for (int i = 3; i <= n;i+=2)
r[i] = max(r[i], r[i - 2] - 2);
for (int i = n; i >= 1;i-=2)
l[i] = max(l[i], l[i + 2] - 2);
** : 馬拉車演算法
思路筆記 上述情況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 的暴力演算法,馬拉車演算法無疑是求解最長回文子串的最優選擇。最長回文子串分為偶數串和奇數串,為了避免這些問題,馬...
馬拉車演算法
馬拉車演算法查詢 字串的最大回文子串。其演算法本質上是中心擴充套件法。中心擴充套件法 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 不考慮越界 而馬拉...