CF585F Digits of Number Pi
题意:
给定长度为 的数字串 和长度为 的不含前导零的数字串 。
求存在长度至少为 的子串是 的子串的数字串 的数量。
,,答案对 取模。
算一道挺难的题,质量也不错,适合练码力。
怎么表示一个长度为 的串在s中出现,我们发现s长度并不是很大,1000,我们把s中所有长度大于等于 的串一起建立一个AC自动机,然后发现只需要把长度等于 的建AC自动机就好了,因为包含长度大于 的串也就肯定包含等于 的串。
然后把每个串的末尾点和该点fail子树上所有点打上标记,表示如果走到这个点,就能包含一个长度为 的子串。
关于 树的意义不想在这里讲了qwq,如果不了解的话可以去康康别的博客。
AC自动机建好之后,我们将所有的串在这上面跑,能走到打标记的点的串就是可以匹配的串。但是虽然一个匹配串长度只有不到50,但是数量太多了!我们要统计所有属于 的数字串,所以我们还得套一个数位dp。
定义 表示枚举到数字第 位(从高位开始),现在在AC自动机上的哪个位置,是否卡上界,是否已经匹配,的方案数。最后统计答案就是将所有枚举到第 位的,在任意位置的,卡不卡上界都行的,已经匹配了的,方案数加起来。
跑两次数位dp记得清空数组,初始状态为 ,就是还没有放数字,在根节点,卡上界(一开始肯定要卡的,不然后面放飞了),没有匹配(没有空串肯定没有匹配)。
转移思路和其他的数位dp一样,这里AC自动机可以方便地进行位置上的转移,代码细节很多,要仔细一点,要么根本没法调。我们将转移按 “数字是否超上界或等于上界”,“是否已经匹配”来分成六类,每类分别进行不同的转移,调试可能也好调一些吧。
放代码的话我把模数去掉了,不然有点乱。
:
傻了傻了,为啥要定义的这么麻烦啊,我们只记录不经过任何标记点的情况数,再用总情况减去它不就行了?
少了一维,而且状态转移少了好几倍。
已略去模数。
__EOF__

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具