题意就不说了 中问题
求一个单调不减的最长的回文串的长度,只需要在判断回文条件时加一个单调不减的条件就好了
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<stack>
#include<map>
#include<set>
using namespace std;
#define LL long long
const int MOD=100000007;
const int inf=0x3f3f3f3f;
const LL inff=0x3f3f3f3f3f3f3f3f;
const LL N=20000005;
const LL M=50005;
#define MEF(x) memset(x,-1,sizeof(x))
#define ME0(x) memset(x,0,sizeof(x))
#define MEI(x) memset(x,inf,sizeof(x))
int al[200005];
int p[200005];
void manacher(int *s,int cnt)
{
p[0]=1;
int id=0,mx=0;
for(int i=1;i<=2*cnt+1;i++)
{
p[i]=i<mx?min(mx-i,p[id*2-i]):1;
while(s[i+p[i]]==s[i-p[i]]&&s[i+p[i]]<=s[i+p[i]-2])//加一个条件s[i+p[i]]<=s[i+p[i]-2]
{
p[i]++;
}
if(i+p[i]>id+p[id])
{
id=i;
mx=i+p[i];
}
}
}
int main()
{
int t;
scanf("%d",&t);
for(int t1=1;t1<=t;t1++)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&al[i]);
}
for(int i=n;i>=0;i--)
{
al[(i<<1)+1]=-1;
al[(i<<1)+2]=al[i];
}
al[0]=-2;
manacher(al,n);
int ans=0;
for(int i=1;i<=2*n+1;i++)
{
if(ans<p[i]-1)
{
ans=p[i]-1;
}
}
printf("%d\n",ans);
}
return 0;
}