[51Nod1089] 最长回文子串 V2(Manacher算法)
2017-06-25 21:09
375 查看
1089 最长回文子串 V2(Manacher算法)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
Output
Input示例
Output示例
思路
manacher算法;
学习学习↓
http://www.61mon.com/index.php/archives/181/
代码实现
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
思路
manacher算法;
学习学习↓
http://www.61mon.com/index.php/archives/181/
代码实现
#include<cstdio> #include<cstring> const int maxn=3e6+10; inline int max_(int x,int y){return x>y?x:y;} inline int min_(int x,int y){return x<y?x:y;} int l,len,p[maxn]; char s[maxn],os[maxn]; int ans,id,mx=-1; void manachar(){ for(int i=1;i<l;i++){ if(id+mx>i) p[i]=min_(p[id*2-i],id+mx-i); while(i-p[i]-1>=0&&i+p[i]+1<=l&&os[i-p[i]-1]==os[i+p[i]+1]) p[i]++; if(id+mx<i+p[i]) id=i,mx=p[i]; ans=max_(ans,p[i]); } } int main(){ scanf("%s",s); len=strlen(s),l=-1; for(int i=0;i<len;i++) os[++l]='#',os[++l]=s[i]; os[++l]='#'; manachar(); printf("%d\n",ans); return 0; }
相关文章推荐
- 51nod1089 最长回文子串 V2(Manacher算法)
- 51nod1089---最长回文子串 V2(51nod基础:Manacher算法)
- 最长回文子串 V2(Manacher算法)
- 51nod 1089 最长回文子串 V2(Manacher算法)
- 51nod1089最长回文子串--Manacher算法(Java语言)
- 最长回文子串 V2(Manacher算法)
- 1089 最长回文子串 V2(Manacher算法)
- 51nod-1089 最长回文子串 V2(Manacher算法)
- 51Nod 1089 最长回文子串 V2(Manacher算法)
- 51Nod 1089 最长回文子串 V2 —— Manacher算法
- 51nod-【1089 最长回文子串 V2(Manacher算法)】
- 51nod1089最长回文子串V2
- [51Nod](1089)最长回文子串 V2 ---- Manacher算法
- 51Nod 1089 最长回文子串 V2(Manacher算法)
- 51nod 1089 最长回文子串 V2(Manacher算法)
- 【51NOD-0】1089 最长回文子串 V2(Manacher算法)
- 51Nod - 1089 最长回文子串 V2(Manacher算法)
- 【51nod】1089 最长回文子串 V2(Manacher算法)
- 51nod1089(最长回文子串之manacher算法)
- 51Nod-1089 最长回文子串 V2(Manacher算法)