一开始看到题目就像到了Manacher算法,然后在判断中加了个条件,交上去Wrong了,改了改又交上去还是Wrong,,只好写了个暴力程序检查,没想到暴力程序居然也Wrong。只好自己做数据差错,卡了1一个小时总算找到罪恶的根源了,主要是刚刚做完4512,把条件记成严格递增了。。。
ACcode:
#include<cstdio>
#include<cstring>
const int ns=222222;
int n,id,mx,ans;
int h[ns],p[ns];
int Min(int a1,int a2)
{
return a1<a2?a1:a2;
}
int Max(int a1,int a2)
{
return a1>a2?a1:a2;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
n=n+n+2;
h[0]=-2;
h[n]=-3;
for (int i=1;i<n;i++)
{
if (i&1) h[i]=-1;
else scanf("%d",&h[i]);
}
ans=1,mx=id=0;
for (int i=1;i<n-1;i++)
{
p[i]=mx>i?Min(mx-i,p[id+id-i]):1;
while (h[i+p[i]]==h[i-p[i]])
{
if (h[i+p[i]]==-1) p[i]++;
else if ((i+p[i]-2<i)||(h[i+p[i]]<=h[i+p[i]-2])) p[i]++;
else break;
}
if (p[i]+i>mx) mx=p[i]+i,id=i;
ans=Max(ans,p[i]);
}
printf("%d\n",ans-1);
}
return 0;
}