1. 程式人生 > 實用技巧 >Manacher演算法模板

Manacher演算法模板

描述

參考資料:

Manacher演算法 - 經典演算法與資料結構 - SegmentFault 思否

hdu3068之manacher演算法+詳解

程式碼

頭部

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] = '\0'; 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]]) // 不需要邊界判斷,因為有"$"、"\0"
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 }