马拉车 Manacher
Manacher,人称马拉车。是用来查找一个字符串的最长回文子串的线性算法。 对于一个子串长度有可能是偶数也可能是奇数。为了实现简单与准确,对原串更改。如 ababca 为 $#a#b#a#b#c#a# ,令新串为 s s s 。 定义 p i p_i p i 为以 i i i 为对称中心的最长回文半径。刚刚栗子的 p p p 为 $ # a # b # a # b # c # a # 1 1 2 1 4 1 4 1 2 1 2 1 2 1 可以发现:非字母字符对应的 p i p_i p i 为奇数,字母字符对应的 p i p_i p i 为偶数。在新串中,因为有其它的字符,所以以 i i i 为中心的最长回文子串长度为 p i − 1 p_{i} - 1 p i − 1 。那么初始化是简单明了的。 void init ( ) { str [ 1 ] = '$' ; str [ 2 ] = '#' ; for ( int i = 1 ; i <= n ; i ++ ) str [ i * 2 + 1 ] = s [ i ] , str [ i * 2 + 2 ] = '#' ; n = ( n + 1 ) * 2 + 1 ; } 难点在构造 p p p ,从左到右构造 p p p 数组。令 m x mx m x 为以 i d id i d