比普通的manacher多添加条件
可以用-1 -2 -3去填充数组
这样可以只比较原数组的大小(当数小于0时不用比较)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1100100;
int Ma[MAXN*2];
int Mp[MAXN*2];
void Manacher(int s[],int len)
{
int l=0;
Ma[l++]=-1;
Ma[l++]=-2;
for(int i=0;i<len;i++)
{
Ma[l++]=s[i];
Ma[l++]=-2;
}
Ma[l]=-3;
int mx=0,id=0;
for(int i=0;i<l;i++)
{
Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1;
while(Ma[i+Mp[i]]==Ma[i-Mp[i]])
{
if(Ma[i-Mp[i]]>Ma[i-Mp[i]+2]&&Ma[i-Mp[i]]>0) break;
Mp[i]++;
}
if(i+Mp[i]>mx){
mx=i+Mp[i];
id=i;
}
}
}
int s[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int len;
scanf("%d",&len);
for(int i=0;i<len;i++)
{
scanf("%d",&s[i]);
}
Manacher(s,len);
int ans=0;
for(int i=0;i<2*len+2;i++)
ans=max(ans,Mp[i]-1);
printf("%d\n",ans);
}
return 0;
}