#include<iostream>
using namespace std;
#define N 100010
int len[N<<1];
int a[N<<1];
int Manacher(int n)
{
int i,ans,mx,po;
ans=po=mx=0;
for(i=1;i<=(n<<1)+2;i++)
{
if(mx>i)
len[i]=mx-i<len[(po<<1)-i]?mx-i:len[(po<<1)-i];
else
len[i]=1;
while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2]) //因为有填充字符'#',所以要+2。
len[i]++;
if(i+len[i]>mx)
{
mx=i+len[i];
po=i;
}
ans=ans>len[i]?ans:len[i];
}
return ans-1;
}
int main()
{
int T,n,i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
a[0]=-100;
for(i=1;i<=n<<1;i+=2)
{
a[i]=-200; //相当于'#'
scanf("%d",&a[i+1]);
}
a[i]=-200; //相当于'#'
a[i+1]=-300;
printf("%d\n",Manacher(n));
}
return 0;
}HDU ACM 4513 吉哥系列故事——完美队形II->求最长回文串(manacher算法)
原文地址:http://blog.csdn.net/a809146548/article/details/45506929