链接:点击打开链接
题意:求最长向中心递增回文子串
代码:
#include <map>
#include <set>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=200005;
int a[siz],s[siz],L[siz];
int manacher(int len){
int i,id,mx,ans;
id=mx=ans=0;
for(i=0;i<len;i++){
if(i<mx)
L[i]=min(L[2*id-i],mx-i);
else
L[i]=1;
while(s[i-L[i]]==s[i+L[i]]){
if(s[i-L[i]]==-1)
L[i]++;
else{ //左右扩展时特判一下
if(s[i-L[i]]<=s[i-L[i]+2])
L[i]++;
else
break;
}
}
if(i+L[i]>mx){
id=i;
mx=i+L[i];
}
ans=max(ans,L[i]-1);
}
return ans;
}
int main(){
int t,n,i,j,len;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
s[0]=0,s[1]=-1,len=2;
for(i=0;i<n;i++){
s[len++]=a[i];
s[len++]=-1;
}
s[len++]=-1;
printf("%d\n",manacher(len));
}
return 0;
}