地址:http://acm.hdu.edu.cn/showproblem.php?pid=4513
思路:Manacher算法,在判断回文的时候一并判断其是否上升
Code:
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_N=200050;
int n,m,T;
int len[MAX_N];
int a[MAX_N];
int Manacher(int a[]);
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
memset(len,0,sizeof(len));
m=0;
cin>>n;
for(int i=0,x;i<n;++i)
{
cin>>x;
a[m++]=-1,a[m++]=x;
}
a[m++]=-1;
n=m;
cout<<Manacher(a)<<endl;
}
return 0;
}
int Manacher(int a[])
{
int ans=1,p=0,l=0,r=0;
for(int i=0;i<n&&r<n;++i)
if(i<r&&len[2*p-i]<r-i) len[i]=len[2*p-i];
else{
if(i<r&&len[2*p-i]>=r-i){
l=2*i-r; p=i;
}else p=l=r=i;
int xi=a[i];
if(xi==-1) xi=1e7;
while(l>=0&&r<n){
if(a[l]==a[r]&&a[l]<=xi){
if(a[l]!=-1) xi=a[l];
l--; r++;
}else break;
}
len[i]=r-p;
ans=max(ans,len[i]);
}
return ans-1;
}