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

Manacher 的一个优雅结论

做题遇到了一个 trick,想了两天,求助教练,LLM 无果后,在大佬的帮助下明白了。

考虑以下 Manacher 代码的改版:

int n=s.size(),C=0,R=-1;
vector<int> p(n);
for(int i=0;i<n;i++){if(i<=R){//就是这样收缩int j=2*C-i;p[i]=p[j];while(p[i]>R-i+1) p[i]--;}else p[i]=1;while(i-p[i]>=0 && i+p[i]<n && s[i-p[i]]==s[i+p[i]]) p[i]++;int right=i+p[i]-1;if(right>=R) C=i,R=right;//是 >=,不是 >
}

其中相对于正常的 Manacher,将取 min 换成了朴素的收缩。这种改版,支持代码完成更多操作,减少数据结构的使用。

其实,这版代码的时间复杂度是线性的

证明

考虑势能分析。

Manacher 一共扩张 \(O(n)\) 次,每次扩张会使一个 \(p\)(半径)值最多增加 \(1\)

操作等效于:从 \(mid\)(最靠右回文串的对称轴)前面对称过来的回文串会先收缩到靠右回文串以内,再对称过来。

因为最多扩张 \(O(n)\) 次,所以只要每次收缩的回文串不是同一个,那么最多也只能收缩 \(O(n)\) 次。

如何保证?注意到代码倒数第二行的大于等于号,不难发现,如果出现需要收缩的情况,那么就算暴力扩展次数为 \(0\),也一定会更新最靠右的回文串。于是每次收缩的回文串肯定不是同一个,证毕。

一道练习题

#include<bits/stdc++.h>
#define ll __int128
using namespace std;
/*
FACE THE FEAR, MAKE THE FUTURE.
P12977 泪雨 Namid[A]me
需要维护:括号数量,当前总贡献(合法子回文串括号数量之和),区间长度。
*/
const int N=5e6+7;
int n; string s;
ll p[N<<1],contr[N<<1],num[N<<1];
ll c,r,ans;int skl;void pre(){string t="$#";for(char ch:s) t+=ch,t+="#";t+="$"; s=t,n=s.size();
}void work(){for(int i=1;i<n;i++){if(i<=r){int j=2*c-i;while(p[j]>r-i+1){if(s[j+p[j]-1]=='#'&&num[j]*2>=p[j]-1) contr[j]-=num[j];if(s[j+p[j]-1]=='?') num[j]-=2;p[j]--;} contr[i]=contr[j],num[i]=num[j],p[i]=p[j];}else p[i]=1,num[i]=(s[i]=='?');while(s[i-p[i]]!='$'&&s[i+p[i]]!='$'&&s[i-p[i]]==s[i+p[i]]){num[i]+=2*(s[i+p[i]]=='?'); p[i]++;if(s[i+p[i]-1]=='#') contr[i]+=(2*num[i]>=p[i]-1)*num[i];}if(i+p[i]-1>=r) r=i+p[i]-1,c=i;ans+=contr[i]*i/2;}
}int main(){cin>>skl>>s;pre();work();if(ans==0) cout<<0;stack<int> stk;while(ans){stk.push(ans%10);ans/=10;} while(stk.size()) cout<<stk.top(),stk.pop();return 0;
}
http://www.jsqmd.com/news/396865/

相关文章:

  • 220
  • ABAQUS模型:基于CEL算法的桩入土的粒子示踪技术。 使用abaqus的cel流固耦合算法
  • 用数据说话 9个AI论文工具测评:专科生毕业论文写作必备神器
  • 计算机毕业设计 | SpringBoot+vue企业员工薪酬关系管理系统(附源码+论文)
  • 科伦博泰:默沙东启动芦康沙妥珠单抗第17项全球三期临床
  • 求助,《信号与系统》是做什么的?
  • 计算机毕业设计 | SpringBoot+vue学生网上选课系统 学生成绩管理(附源码+论文)
  • 照着用就行:更贴合本科生的降AIGC工具,千笔·降AIGC助手 VS Checkjie
  • 2026热门斜齿轮减速机实力厂家排行,有联系电话哦,实心轴齿轮减速机/伺服减速机/立式齿轮减速机,斜齿轮减速机厂商电话 - 品牌推荐师
  • 11]delphi中 RichEdit1设置行距
  • 工业网带怎么选?这些国产品牌值得关注,上料提升机/链板提升机/平顶链板/皮带输送机/网带提升机,网带产品推荐榜 - 品牌推荐师
  • 计算机毕业设计 | SpringBoot+vue校园资产管理 高校财务管理系统(附源码+论文)
  • 参考文献崩了?8个AI论文网站测评:本科生毕业论文写作全攻略
  • 计算机毕业设计 | SpringBoot+vue智慧校园之家 家长教师联系管理平台(附源码+论文)
  • 一小时闲聊:中国制造业升级成功了吗?中国能否走日韩的道路?具身智能到底能否成功?春晚机器人表演是否造假?电动车、半导体产业还有多少增长空间?字节seedance会颠覆硅谷吗?
  • 干货来了:专科生专属降AI率网站,千笔·降AI率助手 VS PaperRed
  • 2026年艺术漆选购指南:如何甄选优质供应商,艺术肌理漆/艺术涂料/诺兰迪艺术涂料/微晶石艺术漆,艺术漆生产厂家怎么选择 - 品牌推荐师
  • 直接上结论:10个AI论文写作软件测评!本科生毕业论文+科研写作必备工具推荐
  • 镜像视界空间操作系统全球战略布局与未来十年技术路线图——从视频系统升级到空间计算基础设施
  • 第六章镜像视界空间操作系统白皮书终章——空间计算时代的治理哲学与技术伦理
  • 基于Python基于flask框架网上药品商城购买系统-Pycharm django
  • 基于Python基于flask的中医院问诊知识科普系统的设计与实现-vue-Pycharm django
  • 基于Python基于flask框架的社区老年人帮扶系统-Pycharm django
  • 成都冒菜加盟考察指南:合作口碑是关键,冒菜店/冒菜/餐饮/麻辣烫,成都冒菜加盟公司哪家权威 - 品牌推荐师
  • lambda+sealed+record
  • 笔记:对拍器
  • 【花雕学编程】Arduino BLDC 之抗辐射强化型特种机器人
  • day018
  • 2026探寻市场口碑好的三轮滚丝机实力厂家,滚丝机 /二轮滚丝机 /三轮滚丝机 /滚牙机 ,三轮滚丝机厂家推荐 - 品牌推荐师
  • 毕业论文神器!专科生专属AI论文网站 —— 千笔·专业学术智能体