manacher算法
求字符串s的最长回文子串t。只考虑长度为奇数的回文串。
对于每个位置i,计算最大的r[i],表示s[i-r[i]]~s[i+r[i]]能构成回文串。
f(i)=i+r[i]表示以i为中心的字符串的右边界。
如何计算r[i],可以暴力扩展,也可以利用以下性质。
1~i-1,f(c)最大。如果f(c)>i,r[i]>=min(r[2c-i], f(c)-i); 否则r[i]>=0。
再暴力扩展r[i],更新c。
求字符串s的最长回文子串t。只考虑长度为奇数的回文串。
对于每个位置i,计算最大的r[i],表示s[i-r[i]]~s[i+r[i]]能构成回文串。
f(i)=i+r[i]表示以i为中心的字符串的右边界。
如何计算r[i],可以暴力扩展,也可以利用以下性质。
1~i-1,f(c)最大。如果f(c)>i,r[i]>=min(r[2c-i], f(c)-i); 否则r[i]>=0。
再暴力扩展r[i],更新c。