Manacher模板

Posted slrslr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Manacher模板相关的知识,希望对你有一定的参考价值。

就是个板子。

基本思想就是每次往外扩,复杂度也很显然,因为如果当前位置能往外扩就往外扩,不能就直接停下,每个点只会被扩展到一次,所以就是O(n)。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define maxn 51000100
 5 using namespace std;
 6 int n,ans,len[maxn];
 7 char a[maxn],s[maxn*2];
 8 void change()
 9 {
10     s[0]=s[1]=#;
11     for(int i=0;i<n;i++)
12     {
13         s[i*2+2]=a[i];
14         s[i*2+3]=#;
15     }
16     n=n*2+2;
17     s[n]=0;
18 }
19 void manacher()
20 {
21     int maxright=0,mid;
22     for(int i=1;i<n;i++)
23     {
24         if(i<maxright) len[i]=min(len[2*mid-i],len[mid]+mid-i);
25         else len[i]=1;
26         while(s[i-len[i]]==s[i+len[i]]) len[i]++;
27         if(len[i]+i>maxright)
28         {
29             maxright=len[i]+i;
30             mid=i;
31         }
32     }
33 }
34 int main()
35 {
36     scanf("%s",a);
37     n=strlen(a);
38     change();
39     manacher();
40     ans=1;
41     for(int i=0;i<n;i++) ans=max(ans,len[i]);
42     printf("%d",ans-1);
43     return 0; 
44 }

 

以上是关于Manacher模板的主要内容,如果未能解决你的问题,请参考以下文章

manacher马拉车算法

Manacher模板

HDU 3068 最长回文(manacher模板题)

P3805 模板manacher算法(马拉车)

manacher模板

洛谷P3805 [模板]Manacher算法 [manacher]