BZOJ 2342: [Shoi2011]双倍回文
2342: [Shoi2011]双倍回文
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3286 Solved: 1247
[Submit][Status][Discuss]
Description
Input
输入分为两行,第一行为一个整数,表示字符串的长度,第二行有
个连续的小写的英文字符,表示字符串的内容。
Output
输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0。
Sample Input
16
ggabaabaabaaball
ggabaabaabaaball
Sample Output
12
HINT
N<=500000
题解:
Manacher+枚举
代码:
#include<iostream> #include<cstring> #include<cstdio> #define maxn 500009 using namespace std; char s[maxn*2],str[maxn*2]; int Len[maxn*2],len,n; void getstr(){ int k=0;str[k++]='$'; for(int i=0;i<len;i++){ str[k++]='#';str[k++]=s[i]; } str[k++]='#';len=k; } void Manacher(){ getstr();int mx=0,id; for(int i=1;i<len;i++){ if(mx>i)Len[i]=min(Len[2*id-i],mx-i); else Len[i]=1; while(str[i+Len[i]]==str[i-Len[i]]) Len[i]++; if(Len[i]+i>mx)mx=Len[i]+i,id=i; } } int main(){ scanf("%d",&n); scanf("%s",&s);len=n; Manacher();int ans=0; for(int i=1;i<=len;i++){ if(str[i]=='#'&&Len[i]>ans+1) for(int j=((Len[i]-1)/4)*2;j>ans/2;j-=2){ if(Len[i+j]>=j&&Len[i-j]>=j){ ans=max(ans,j*2);break; } } } printf("%d\n",ans); return 0; }
分类:
字符串
, 字符串—Manacher
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术