描述
参考资料:
代码
头部
1 #include <cstring> 2 #include <algorithm> 3 4 const int N = 1e5+10; 5 char s[N],s_new[N*2]; 6 int p[N*2];
初始化
1 int Init() 2 { 3 int len = strlen(s); 4 s_new[0] = '$'; 5 s_new[1] = '#'; 6 int j = 2; 7 8 for(int i = 0;i < len;i++) 9 { 10 s_new[j++] = s[i]; 11 s_new[j++] = '#'; 12 } 13 14 s_new[j] = ' '; 15 16 return j; // 返回 s_new 的长度 17 }
Manacher
1 int Manacher() 2 { 3 int len = Init(); // 取得新字符串长度并完成向 s_new 的转换 4 int max_len = -1; // 最长回文长度 5 6 int id; 7 int mx = 0; 8 9 for(int i = 1;i < len;i++) 10 { 11 if(i < mx) 12 p[i] = min(p[2*id-i],mx-i); 13 else 14 p[i] = 1; 15 16 while(s_new[i-p[i]] == s_new[i+p[i]]) // 不需要边界判断,因为有"$"、" " 17 p[i]++; 18 19 // 每走一步都要用i和mx比较 20 if(mx < i+p[i]) 21 { 22 id = i; 23 mx = i+p[i]; 24 } 25 max_len = max(max_len,p[i]-1); 26 } 27 return max_len; 28 }