D, E: Silly_Tape的字符串

容易发现,一个串 S 内的奇数长度的回文子串的数量随着长度减少单调非递减,因为对于一个长度为 K 的奇数长度回文串 P,

P[2:K-1], P[3:K-2] ... (下标从1开始) 显然也是奇数长度的回文串。

因此有一个很显然的结论: 设 L 为字符串 T 内最长奇数长度回文串的长度,带入连续奇数求和公式,则有字符串 T 的总价值为 ceil(L / 2) ^ 2

同时因为奇数长度回文子串的数量具有单调性,可以通过二分查找来确定最大的 L,接下来考虑如何检查二分查找每一步选择的中点 mid 是否可行。

对串 T 进行一遍 Manacher 算法获取 T 内以每个下标 i 为中心的最长回文串长度 D[i] 后,容易发现上面的问题实际上是查询 D 中 满足 floor(mid / 2) + 1 <= i <= D的长度 - floor(mid / 2) 且 D[i] >= mid 的 i 的数量。

对于 easy version,因为只需要存在一个长度为 L 的奇数长度回文子串就可以,我们只需要查询区间 D[i] 的最大值,使用 ST 表即可。

对于 hard version,使用可持久化线段树即可。

全部评论
实在太牛
点赞 回复 分享
发布于 2024-04-07 15:33 湖北
我去你好强
点赞 回复 分享
发布于 2024-04-07 00:10 香港
floor(mid / 2) + 1 <= i <= D的长度 - floor(mid / 2)  这个约束是避免在区间查询时越界,查询到子串所不包含的字符。
点赞 回复 分享
发布于 2024-04-06 18:07 陕西

相关推荐

不愿透露姓名的神秘牛友
07-24 13:35
点赞 评论 收藏
分享
DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务