您的位置:首页 > 其它

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

2017-06-25 21:09 337 查看
1089 最长回文子串 V2(Manacher算法)

基准时间限制: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: