网上的题解都是回文树的做法,改天学一波。
#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,Ans;
int Radius[MAX];
int F[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 (F[i-Radius[i]+1]<Radius[i]*2-1) F[i-Radius[i]+1]=Radius[i]*2-1;
if (k+Radius[k]-1<i+Radius[i]-1) k=i;
}
}
int main()
{
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();
Ans=0;
for (int i=2,k=1;i<Len;i++)
{
if (F[i]<F[i-1]-2)
F[i]=F[i-1]-2;
while (k+Radius[k]-1<i)
k++;
if ((i&1)&&k<i&&Ans<F[i]+(i-k)*2+1)
Ans=F[i]+(i-k)*2;
}
printf("%d\n",Ans/2);
}
return 0;
}
HYSBZ - 2565 最长双回文串 Manacher
最新推荐文章于 2019-09-12 17:37:45 发布