题意:
求最长非递减回文子串,非递减指从两侧到中间非递减。
思路:本来是先求的最长回文,然后遍历解决非递减的问题,然后超时了。于是就在求回文的时候直接求的非递减。
三目运算符那里错了,应该是mx-i,写成了mx-1,一直没看出来,卡了好久。。。
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e6;
int s[N],sn[N],n;
int p[N];
void init(){
sn[0] = -1;
sn[1] = 0;
int j=2;
for(int i = 0 ;i < n ;++i){
sn[j++] = s[i];
sn[j++] = 0;
}
}
int Manacher(){
init();
int id = 0,mx = 0,ans = 0;
for(int i=1;i<=2*n+1;++i){
p[i] = (mx > i)?min(p[2*id-i],mx-i):1;
while(sn[i+p[i]] == sn[i-p[i]] && sn[i+p[i]] <= sn[i+p[i]-2] ) p[i]++;
if(mx < i + p[i]){
id = i;
mx = i + p[i];
}
ans = max(ans,p[i]-1);
}
return ans;
}
int main(int argc, char const *argv[])
{
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;
}