#include<iostream>
#include<queue>
#include<algorithm>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MAX=1111111<<1;
char Str[MAX],Ch;
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()
{
int Cases=0;
while (scanf("%s",Str)!=EOF)
{
if (Str[0]=='E'&&Str[1]=='N'&&Str[2]=='D'&&Str[3]=='\0')
break;
Len=strlen(Str);
for (int i=Len;i>=0;i--)
{
Str[i*2+1]='#';
Str[i*2+2]=Str[i];
}
Len=Len*2+2;
Str[0]='*',Str[Len]='\0';
Manacher();
printf("Case %d: %d\n",++Cases,(*max_element(Radius,Radius+Len))-1);
}
return 0;
}
POJ 3974 Palindrome Manacher
最新推荐文章于 2020-07-13 16:41:19 发布