Loading

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 }

 

posted @ 2021-01-20 18:10  Yiduuannng  阅读(43)  评论(0编辑  收藏  举报