hdu 3068 最长回文 manacher
2015-03-15 15:30
465 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba,
abba等
题目描述:中文题,不翻译。
算法分析:求解最长回文串的长度,当选O(n)的manacher算法。
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba,
abba等
题目描述:中文题,不翻译。
算法分析:求解最长回文串的长度,当选O(n)的manacher算法。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #define inf 0x7fffffff using namespace std; typedef long long LL; const int maxn=110000+100; char str[maxn],s[3*maxn+1000]; int p[3*maxn+100],cnt; void manacher() { int mx=0,id=0; for (int i=1 ;i<cnt ;i++) { if (mx>i) p[i]=min(p[2*id-i],mx-i); else p[i]=1; for ( ;s[i+p[i] ]==s[i-p[i] ] ;p[i]++) ; if (p[i]+i>mx) { mx=p[i]+i; id=i; } } //cout<<p[id]-1<<endl; int ans=0; for (int i=1 ;i<cnt ;i++) ans=max(ans,p[i]); cout<<ans-1<<endl; } int main() { memset(str,0,sizeof(str)); while (scanf("%s",str)!=EOF) { cnt=0; memset(s,0,sizeof(s)); memset(p,0,sizeof(p)); s[cnt++]='$'; int len=strlen(str); for (int i=0 ;i<len ;i++) { s[cnt++]='#'; s[cnt++]=str[i]; } s[cnt++]='#'; s[cnt]=0; manacher(); } return 0; }
相关文章推荐
- HDU - 3068 最长回文(manacher)
- hdu-3068-最长回文(manacher)
- hdu 3068 最长回文子串 manacher
- 最大算法【Manacher模板】HDU 3068——求最长回文子串
- HDU 3068 最长回文 (Manacher最长回文串)
- hdu 3068 最长回文 (Manacher算法求最长回文串)
- HDU 3068 最长回文 [Manacher]【字符串】
- hdu 3068 最长回文(manacher)
- HDU - 3068 最长回文(manacher模板题)
- hdu 3068 最长回文 【Manacher求最长回文子串,模板题】
- HDU 3068 最长回文 // Manacher
- HDU 3068 最长回文 (manacher)
- HDU 3068 最长回文(Manacher)
- hdu----(3068)最长回文(manacher)
- hdu 3068 最长回文(manacher)
- HDU - 3068 - 最长回文(Manacher)
- HDU 3068 最长回文 Manacher
- hdu 3068 最长回文 -Manacher
- 【Manacher模板】HDU 3068——求最长回文子串
- hdu 3068 最长回文 Manacher求最大回文串