[51Nod1089] 最长回文子串 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\n",ans); 24 return 0; 25 }