今天打算补前晚 BC 的第二题,发现要用到能在 O(n) 时间求最大回文子串长度的 Manacher 算法,第一次听,于是便去百度了下,看了大半天,总算能看懂了其思想,至于他给出的代码模板我没能完全看懂,只好自己试着实现,发现理解了思想后还是能实现出来的,用自己的风格去写更好理解,先附上讲解 Manacher 算法的几个链接:
Manacher算法--O(n)回文子串算法 (我就是看这个理解的~)
hdu 3068 正好是裸题,我便试着写下,我是这样子构造新串的:
hdu 3068 代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N = 110005; 6 7 // str 为原串, s 为新串 8 char str[N], s[N << 1]; 9 int p[N << 1]; 10 // p[i] 表示以 s[i] 为中心时的回文半径,不包括 p[i] 11 // 即若 s[i - 1] != s[i + 1] 时,p[i] = 0; 12 13 int main() { 14 while(~scanf("%s",str)) { 15 int n = strlen(str); 16 s[0] = '$'; // 构造新串 17 s[1] = '#'; 18 for(int i = 0; i < n; ++i) { 19 s[i * 2 + 2] = str[i]; // 下标要处理好 20 s[i * 2 + 3] = '#'; 21 } 22 n = n * 2 + 2; // 更新新串的长度 23 s[n] = '