NOI2016
-
首先一个很明确的方向就是对于每一个拆分的位置算贡献
-
也就是对于每个位置求出前面有多少个形如 AA 的子串,求出后面有多少形如 BB 的子串,答案就是所有位置两者相乘的和
-
而实际上前缀和后缀是一样的,无非是将子串翻转一下再做,所以考虑一种就可以了
-
一个暴力的做法就是
用 Hash 判断,然而这样就有了 95 分了(多少有点随意了......),考虑最后的 5 分怎么拿 -
讲实话正解不是很好想,考虑枚举每一个 A 可能的长度,然后以
为关键点 -
那么
一定会经过恰好两个相邻关键点 -
那么我们考虑对于两个关键点求贡献,求出
,根据这个可以算出通过这两个关键点的 的范围,对于这个范围整体 + 1,这个可以差分做 -
对于
考虑 SAM 的做法就是求 parent 树上的 lca 的深度,那么考虑用 ST 表求正串和反串的 parent 树的 lca -
关键点对的数量是一个调和级数,所以总的复杂度是
总结
-
SAM
-
关键点的想法确实是很难想的,难怪
会给到 95 分,不过两者思想的差距确实还是很大的
-
考虑在 k 进制下的循环小数
,设 表示 的小数部分,设 为循环小数的长度 -
那么
-
那么
-
那么
,那么 -
那么
,那么 -
那么其实就是要求 :
-
下面就是开始推式子了
- 那么第一层确定为数论分块了
- 设
,这个拿 反演一下就是 ,这一部分的复杂度就是 - 设
- 考虑将最后的一个式子拆开,注意到如果
,那么
-
边界为
,这个就直接杜教筛 -
事实上这个东西的复杂度在于杜教筛,所以为
-
总的复杂度就是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】