思路:
本题与求最长回文串的题一样,只是多加了一个条件
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
int len[2*maxn];
int s[maxn],str[2*maxn];
int k,id,mx,n;
int Manacher()
{
k = 0;
str[k++] = -2;
for(int i=0;i<n;i++)
{
str[k++] = -1;
str[k++] = s[i];
}
str[k++] = -1;
len[0] = mx = id = 0;
int sum = 0;
for(int i=1;i<k;i++)
{
if(i<mx)
len[i] = min(mx-i,len[2*id-i]);
else
len[i] = 1;
while(str[i-len[i]]==str[i+len[i]] && str[i-len[i]]<=str[i-len[i]+2])
len[i]++;
if(len[i]+i > mx)
{
mx = len[i]+i;
id = i;
sum = max(sum,len[i]);
}
}
return sum-1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",s+i);
printf("%d\n",Manacher());
}
return 0;
}