hdu 3068
2017-11-30 09:51
134 查看
点击打开链接 //manacher算法求最长回文子串,时间复杂度为O(n) //关键是构造P数组 #include <iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=(110000+5)*2; int P[maxn]; char T1[maxn]; char T2[maxn]; //P[i]-1恰好是位置i处的最长回文子串长度 //求解P数组 void Manacher(char T[]) { int pos=0,mx=0; P[0]=0; //0位置不考虑,为$标志 for(int i=1;T[i];i++) { if(mx>i) P[i]=min(P[2*pos-i],mx-i); else P[i]=1; while(T[i+P[i]]==T[i-P[i]]) P[i]++; //进行匹配 if(mx<P[i]+i) { mx=P[i]+i; pos=i; } } } // 构造T2串 void init() { int i,j=2; T2[0]='$',T2[1]='#'; //$符号是为了防止数组下标越界 for(i=0;T1[i];i++) { T2[j++]=T1[i]; T2[j++]='#'; } T2[j]='\0'; } int main() { while(scanf("%s",T1)!=EOF) { init(); Manacher(T2); int ans=0; for(int i=1;T2[i];i++) ans=max(ans,P[i]); printf("%d\n",ans-1); } return 0; }
相关文章推荐
- HDU 3068 最长回文
- hdu 3068(最长回文子串O(n))
- hdu-最长回文-3068
- HDU 3068 最长回文子串
- HDU 3068:最长回文【回文字符串】
- hdu 3068(最长回文子串O(n))
- HDU 3068 Manacher 算法 求最大回文
- hdu 3068 最长回文(manacher算法)
- hdu 3068 最长回文串
- 【无聊放个模板系列】HDU 3068 MANACHER
- HDU 3068 最长回文 【Manacher模板】
- HDU 3068 最长回文
- hdu 3068 最长回文 (manacher算法)
- HDU - 3068_最长回文_马拉车模板题
- HDU 3068 Manacher 模版题
- HDU 3068 最长回文串
- hdu----(3068)最长回文(manacher)
- Hdu 3068 最长回文
- hdu 3068 最长回文 + 最长回文串算法
- HDU 3068 Manacher 算法 求最大回文