当前位置: 首页 > news >正文

P4555 [国家集训队] 最长双回文串 踢姐

P4555 [国家集训队] 最长双回文串 踢姐

简要题意:

给定一个字符串 \(S\) ,我们定义字符串 \(T\) 的双回文子串为:存在两个字符串 \(X\)\(Y\)\(T\) 的非空子串,满足 \(X\)\(Y\) 无重叠部分并且两个字符串均为回文串,求给定字符串中出现的最长双回文子串长度。

思路分析:

我们发现很难直接确立最终分割点,我们观察可得对于字符串 \(S\) 中的一个分割点可以确立唯一最大长度,故我们尝试对每一个分割点求出答案,即找到分割点 \(i\) 左右两侧的回文串里,左右边界恰好抵达点 \(i\) 的长度尽可能大的回文串的长度加和,接下来便可以使用Manacher直接求出每一个回文中心可以拓展出的最大回文串长度 \(p_i\) ,记录对于回文中心 \(i\) 拓展出的最大回文串的左右边界到了哪里,并记录对于以 \(i\) 为回文中心扩展得到的最长回文串左右边界到达的分割点,我们开两个数组 \(lc_i\)\(rc_i\) 分别记录左/右边界到达分割点 \(i\) 的回文串的回文中心编号,我们自然希望对于某个分割点,其左/右侧拼接的回文串尽可能长,那么对于两个回文串左边界都到达了 \(i\) 时,我们贪心的选取编号更大的,因为回文中心距离更远,故这个回文串更长,反之同理。

此时我们会发现一些问题,对于如下样例:

baacaabbacabb

我们会发现我们匹配得到的结果是 baacaab + bb ,很玄幻,我们期望是匹配到 baacaab + bacab 或者 aacaa + bbacabb ,但是很显然我们没有匹配到,我们的贪心思路并没有问题,此时我们发现对于该字符串的回文子串 baacaab ,按照我们的思路会拓展 \(lc_1\)\(rc_{15}\)bbacabb 会拓展 \(lc_{13}\)\(rc_{27}\) ,而 aacaa 理应拓展 \(lc_3\)\(rc_{13}\) ,但我们输出 \(lc_3\) 发现如下结果:

4

说明 \(lc_3\) 在程序里只能由 a 得到,我们发现,按照我们的思路,我们会拓展对于回文中心 \(i\) 构成的最长回文串的左右边界,但并没有拓展以 \(i\) 作回文中心可以构成的其他回文串,依据我们在 P1659 [国家集训队] 拉拉队排练 踢姐 中得到的结论,即每一个以 \(i\) 为回文中心的最长回文串一定包含 \(\lceil \frac{p_i}{2} \rceil\) 个回文子串,由回文的性质可得,回文子串的左右边界一定是 \([x+c:y-c]\) ,长度一定是 \(p_i-2c\) ,且一定没有除了以 \(i\) 为回文中心的最长回文串包含的回文串以外更多的回文串,故我们也需要更新以 \(i\) 为回文中心的最长回文串包含的所有回文子串的左右边界到达的分割点数组,不难发现这个时间接近 \(\text O(n^2)\) ,我们考虑优化。

我们考虑在记录编号时,对于 \(lc\) 是越大越好,\(rc\) 是越小越好,并且对于每一次更新,我们只更新 \(lc\)\([i-p_i+1,i]\)\(rc\)\([i,i+p_i-1]\) ,并且只用取最大最小值,我们直接使用线段树维护(其实完全有前缀和思想的线性解法,不过我没想出来导致复杂度得带一个 \(\text{log}\) ,这里且算是提供一个次优解)即可。

代码实现:

Manacher得到 \(p_i\) 后,我们写两个线段树分别维护区间最大值与区间最小值,支持区间修改与单点查询,每次修改我们需要的区间,并在枚举分割点的时候单点查询出枚举到的分割点的值,最后求出答案即可。

🐎:

struct Seg{//线段树实现,这里略#define ls (u<<1)#define rs (u<<1|1)int tr[__],tag[__]; // t=0 max | t=1 mininline void rebuild(int n,int t){...}inline void pushup(int u,int t){...}void build(int u,int l,int r,int t){...}inline void pushdown(int u,int t){...}void update(int u,int l,int r,int lt,int rt,int x,int t){...}int query(int u,int l,int r,int id,int t){...}
}lc,rc;
signed main(){#ifdef Zyhxfreopen("hack.in","r",stdin);#endifios::sync_with_stdio(0),cin.tie(0);int i,j,k,l,r,x,y,z; n=5; x=1;cin>>g;l=strlen(g); s[0]='#',s[n=1]='|';for(i=0;i<l;++i) s[++n]=g[i],s[++n]='|'; s[++n]='$';lc.rebuild(n,0),rc.rebuild(n,1);// 这里是初始化taglc.build(1,1,n,0),rc.build(1,1,n,1);for(i=2;i<n;++i){if(i<=rt) p[i]=min(p[(md<<1)-i],rt-i+1); else p[i]=1;for(;i+p[i]<=n&&i+p[i]>=0&&s[i+p[i]]==s[i-p[i]];++p[i]);if(i+p[i]>rt) rt=i+p[i]-1,md=i;lc.update(1,1,n,i-p[i]+1,i,i,0);rc.update(1,1,n,i,i+p[i]-1,i,1);}for(i=3;i<n-1;i+=2){x=lc.query(1,1,n,i,0),y=rc.query(1,1,n,i,1);if(x!=0&&y!=inf&&x-i+i-y>ans) ans=x-i+i-y;}cout<<ans<<endl;return 0;
}
http://www.jsqmd.com/news/47647/

相关文章:

  • 2025年水肥一体机制造厂权威推荐榜单:便携式水肥一体机/全自动喷淋系统/简易水肥一体源头厂家精选
  • 23207225-华辉-第一次blog作业
  • 英语_阅读_AI models_待读
  • 11.22组会
  • 2025年食品厂生产用水紫外线消毒设备优质厂家权威推荐榜单:牛奶厂紫外线消毒设备/饮料杀菌紫外线消毒设备/啤酒生产紫外线消毒设备源头厂家精选
  • 2025年福建钨钢棒回收公司权威推荐榜单:福州钨钢合金回收/福建钨钢模具回收/福建钨钢块回收服务商精选
  • 扩展RTCM消息 - 教程
  • java.nio.charset.MalformedInputException: Input length = 1
  • 线段树问题-从熟练到精通
  • 完整教程:Flowable工作流引擎:核心表结构概述
  • 2025年粗糙轮廓仪厂家权威推荐榜单:轮廓仪/表面轮廓仪/粗糙度轮廓仪源头厂家精选
  • 使用java实验电梯调度算法
  • 2025年刮板蒸发器定做厂家权威推荐榜单:刮板薄膜蒸发器/薄膜蒸发器/刮板式蒸发器装备源头厂家精选
  • 单部电梯调度程序三次迭代设计与实践总结 - 23207231
  • 格路计数的一类(降维?)技巧
  • 百度PaddleOCR-VL:基于0.9B超紧凑视觉语言模型,支持109种语言,性能超越GPT-4o等大模型 - 详解
  • hadoop处理mysql数据的性能瓶颈
  • hadoop在linux的安装
  • hadoop与mysql的综合应用解决方案
  • hadoop与mysql的数据同步方法
  • 详细介绍:2. 容器常用操作
  • 2025年上海黑臭水体修复服务权威推荐榜单:黑臭水体治理方案/河道水净化公司/河道治理服务商精选
  • 2025年KBK刚性组合式起重机供应商权威推荐榜单:KBK起重机/KBK柔性组合式起重机/KBK刚性吊源头厂家精选
  • 珠海爱尔眼科医院联系方式:常见眼病防治建议
  • 一条SQL的完整执行过程:小明查询员工信息的完整冒险故事
  • LangGraph 官方教程:聊天机器人之三 - 实践
  • 2025年不锈钢管锯片供货厂家权威推荐榜单:切H型钢/角钢切割/切碳素钢锯片源头厂家精选
  • 2025年一体式泵站生产厂家权威推荐榜单:污水一体化泵站/预制泵站/雨水泵站源头厂家精选
  • gzip linux
  • gz文件 linux