hdu4513(manacher)
传送门:吉哥系列故事——完美队形II
题意:求最长回文队伍且队伍由中间向两边递减。
分析:manach算法小应用,在判断回文子串向两边递减时加点限制使回文是由中间向两边递减的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#pragma comment(linker,"/STACK:1024000000,1024000000") #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <limits.h> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 100010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PII pair<int,int> using namespace std; inline LL read() { char ch=getchar();LL x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f; } int p[N<<1],ans,len,num,mx,id; int a[N],c[N<<1],n; void build() { n=read(); for(int i=0;i<n;i++)a[i]=read(); num=0; c[num++]=-1;c[num++]=inf; for(int i=0;i<n;i++) { c[num++]=a[i]; c[num++]=inf; } c[num]=-2; } void manacher() { ans=1;mx=0; memset(p,0,sizeof(p)); for(int i=1;i<num;i++) { if(mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(c[i-p[i]]==c[i+p[i]]&&(c[i-p[i]]==inf||p[i]==1||c[i-p[i]]<=c[i-p[i]+2]))p[i]++; if(p[i]+i>mx)mx=p[i]+i,id=i; ans=max(ans,p[i]-1); } } int main() { int T; T=read(); while(T--) { build(); manacher(); printf("%d\n",ans); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步