[51Nod1089] 最长回文子串 V2(Manacher算法)

1089 最长回文子串 V2(Manacher算法)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
 
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
思路
manacher算法;
学习学习↓
代码实现
 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=3e6+10;
 4 inline int max_(int x,int y){return x>y?x:y;}
 5 inline int min_(int x,int y){return x<y?x:y;}
 6 int l,len,p[maxn];
 7 char s[maxn],os[maxn];
 8 int ans,id,mx=-1;
 9 void manachar(){
10     for(int i=1;i<l;i++){
11         if(id+mx>i) p[i]=min_(p[id*2-i],id+mx-i);
12         while(i-p[i]-1>=0&&i+p[i]+1<=l&&os[i-p[i]-1]==os[i+p[i]+1]) p[i]++;
13         if(id+mx<i+p[i]) id=i,mx=p[i];
14         ans=max_(ans,p[i]);
15     }
16 }
17 int main(){
18     scanf("%s",s);
19     len=strlen(s),l=-1;
20     for(int i=0;i<len;i++) os[++l]='#',os[++l]=s[i];
21     os[++l]='#';
22     manachar();
23     printf("%d
",ans);
24     return 0;
25 }
原文地址:https://www.cnblogs.com/J-william/p/7077940.html