您的位置:首页 > 其它

HDU 3068 最长回文 Manacher

2017-02-12 12:58 323 查看
#include<iostream>
#include<queue>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

using namespace std;

const int MAX=111111<<1;
char Str[MAX];
int Len;
int Radius[MAX];

void Manacher()
{
Radius[0]=1;
for (int i=1,k=0;i<Len;i++)
{
if (k+Radius[k]-1<i) Radius[i]=1;
else Radius[i]=min(Radius[2*k-i],k+Radius[k]-i);
while (Str[i-Radius[i]]==Str[i+Radius[i]]) Radius[i]++;
if (k+Radius[k]-1<i+Radius[i]-1) k=i;
}
}

int main()
{
while (scanf("%s",Str)!=EOF)
{
Len=strlen(Str);
for (int i=Len;i>=0;i--)
{
Str[i*2+1]='#';
Str[i*2+2]=Str[i];
}
Str[0]='*';
Len=Len*2+2;
Manacher();
printf("%d\n",(*max_element(Radius,Radius+Len))-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: