馬拉車演算法

2022-02-27 17:46:19 字數 773 閱讀 8245

//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 不考慮越界 而馬拉...