码迷,mamicode.com
首页 > 其他好文 > 详细

Manacher模板

时间:2018-08-18 21:18:06      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:def   不能   %s   har   man   ++   class   int   strlen   

就是个板子。

基本思想就是每次往外扩,复杂度也很显然,因为如果当前位置能往外扩就往外扩,不能就直接停下,每个点只会被扩展到一次,所以就是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模板

标签:def   不能   %s   har   man   ++   class   int   strlen   

原文地址:https://www.cnblogs.com/Slrslr/p/9498580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!