跳转至

Manacher Algorithm

Longest palindrome subsequence

Dynamic Programming

\(O(n^2)\)

Manacher Algorithm

预处理

字符之间插入奇怪的符号

基础概念

  • 回文半径数组 \(radius\)
  • 最右回文右边界 \(R\)
    • 这个位置和它之前的回文子串到达的最右边的地方
  • 最右回文右边界的对称中心 \(C\)

算法流程

第一种情况:下一个要移动的位置在 \(R\) 的右边

这时将移动的位置作为对称中心,向两边扩,更新上面那几个数组

第二种情况:下一个要移动的位置在 \(R\) 处或 \(R\) 的左边

先约定

  • \(P_2\)\(P_1\)\(C\) 为对称中心的对称点
  • \(P_L\) 是以 \(P_2\) 为对称中心的回文子串的左边界
  • \(C_L\)\(P_L\) 一个意思,以 \(C\) 为对称中心

分三种情况

  • \(C_L < P_L\) 这时 \(P_1\) 的回文半径就是 \(P_2\) 的回文半径
  • \(C_L = P_L\) 这时 \(P_1\) 的回文半径还要往外扩,但是只要从 \(R\) 之后往外扩就行了
  • \(C_L > P_L\) 这时 \(P_1\) 的回文半径就是 \(P_1\)\(R\) 的距离