P4156 论战捆竹竿 题解

news/2024/11/15 11:53:28/文章来源:https://www.cnblogs.com/FLY-lai/p/18537078

论战捆竹竿

题意:给定字符串 \(s\),计数 "串 \(t\) 的长度" 可能的种数有多少种,使得 \(t\) 能被 \(s\) 作为印章印出来,且 \(|t|\le w\)\(n=|s|\le 5\times 10^5\)\(n\le w\le 10^{18}\)

第一步:
求出 \(s\) 的周期 \(\{a_1\sim a_m\}\),包含 \(n\)\(a_m=n\))。转化为求 \(\sum a_ib_i\le w-n\) 的情况下,\(\sum a_ib_i\) 的取值有多少种,要求 \(b_i\ge 0\)。记 \(w_0=w-n\)

第二步:
\(\sum a_ib_i\) 的形式,考虑同余最短路。(当题目中出现类似 "若干个数求和" 的形式,可以考虑同余最短路
\(A=\min a_i\),令 \(F_i\) 表示 \(\bmod A=i\) 的所有数中,能表示为 \(\sum a_ib_i\) 的最小数是多少。
如果这里直接跑最短路,一共有 \(A\) 个点,每个点通过 \(a_1\sim a_m\) 都会连出 \(m\) 条边,所以复杂度至少是 \(O(A\cdot m)\) 的。同时可以构造出来 \(s=aaa\dots abaa\dots aaa\),使得周期数量达到 \(O(n)\) 个,同时周期的长度都是 \(\ge n/2\) 的,肯定能被卡。

第三步:
我们需要改进这个方法。根据 border 理论,\(\{a_1\sim a_m\}\) 可以被分成 \(\log n\) 个等差数列。
把每个等差数列单独拎出来,依次考虑。

考虑第 \(k\) 个等差数列 \(\{x,x+d,x+2d,\cdots,x+td\}\),构造 \(x\) 个点编号 \(0\sim x-1\)\(F(i)\) 表示如果使用前 \(k-1\) 个等差数列中的数,它们能组成的数中,\(\bmod x=i\) 的最小数是多少。
我们要用 \(F(i)\) 推出 \(F_{new}(i)\):使用前 \(k\) 个等差数列中的数,它们能组成的数中,\(\bmod x=i\) 的最小数是多少。

首先把同余最短路的图建出来。观察发现,按照 \(gcd(x,d)\) 分类,每一类之间没有边,内部有边。于是我们把 \(\bmod gcd(x,d)\) 相等的一起处理。
也就是说,比如 \(gcd(x,d)=3\),先把 \(F(0),F(3),F(6),\dots\) 转移到 \(F_{new}(0),F_{new}(3),\dots\),然后再转移 \(F(1),F(4),\dots\)\(F(2),F(5),\dots\),各自求解,然后拼出来 \(F_{new}\)

如果还是把 \(\bmod gcd(x,d)\) 相等的点拿出来跑最短路,还是没有优化。这里有一个破环为链的 DP 想法。举个例子,比如当前等差数列是 \(\{15,24,33\}\)\(gcd(15,9)=3\),所以按 \(3\) 的余数分类。比如现在正在处理 \(F(1,4,7,10,13)\)。它们之间的边连出来应该是这样:

不妨 \(F(10)\) 是其中最小的点。我们以 \(10\) 这个点破环为链:只保留从前往后的边(不越界)。我们会证明,在这个链图上如果跑最短路,答案和环图是一样的。

证明:考虑到点 \(x\) 的最短路,假设破环为链的起点是 \(st\)。如果存在另一个点 \(y\),走了一条不存在的边使得 \(dist[x]\) 更短了。但是因为 \(st\)\(F()\) 最小的,所以 \(F(st)<F(y)\);同时因为 \(y\) 走到 \(x\) 是越界的,所以 \(y\)\(x\) 一定比 \(st\)\(x\) 更远,根据等差数列的性质,\(st\) 一定存在一条比 \(y\rightarrow x\) 的边更短的。因为 \(F(st)<F(y)\),而且 \(st\) 出发还有更小的边,所以一定不会存在这样的 \(y\)

因此我们只需要保留这个链图跑最短路。但是真的需要跑最短路吗?是可以优化的。
记链上第 \(i\) 个点的 \(F_{new}\) 值为 \(g_i\)(从 \(0\) 开始编号)。首先可以写出一个朴素的 DP 方程。

\(g_i=\min\{F(i),g[j]+x+(i-j)d|i-t\le j\le i-1,j\ge 0\}\)。这里 \(i-t\)\(t\) 是上面 \(x+td\)\(t\)

这个式子很显然可以单调队列优化,于是复杂度从最短路和边数有关的复杂度,降低到 \(O(\text{点数})\)

这一部分贡献的复杂度,对于每个等差数列会贡献 \(O(\text{点数})\) 的复杂度,一共 \(\log n\) 个等差数列,所以会贡献 \(O(n\log n)\) 的复杂度。

第四步:
第三步解决了从 \(F(i)\rightarrow F_{new}(i)\) 的问题,但是我们还需要让 \(F_{new}(i)\) 的模数变成第 \(k\) 个等差数列的 \(x\),而不是第 \(k-1\) 个等差数列的 \(x\)。例如当前模数(首项) \(x=15\),下一个等差数列模数(首项) \(x=12\)。怎么把 \(F(i)\) 的定义从 \(\bmod 15=i\) 的最小数,转化为 \(\bmod 12=i\) 的最小数,从而更方便用 \(\bmod 12\)\(F(i)\) 推出属于 \(x=12\)\(F_{new}(i)\)

\(\bmod 15\)\(F\) 记作 \(F(i)\)\(\bmod 12\)\(F\) 记作 \(F'(i)\)。新的模数记作 \(x'\)

这里 \(F'(i)\) 的更新取值分两种。

借一个具体的例子,比如 \(F(13)=28\)

第一种:因为 \(28\bmod 12=4\),所以我们知道 \(F'(4)\) 可以取到 \(28\)。也就是如果 \(F(a)=b\),那 \(F'(b\mod x')\leftarrow b\)

第二种:在 \(F\) 里 因为 \(F(13)=28\),所以 \(28+15\omega(\omega\ge 0)\) 都可以取到。在 \(F'\) 里对应着我们会用 \(F(13)+(15\bmod 12)\omega\) 去更新 \(F'\)

考虑 \(F'\) 的更新建成同余最短路的图,实际上每个点只向后方第 \(3\) 个点连边。

理解一下。这里 \(F'\) 的同余最短路的建图和第三步的建图是不同的——\(F'\) 只有一种边,就是向后走 \(15\bmod 12=3\) 步的边。而第三步的建图有 \(\{x,x+d,\dots,x+td\}\) 一共 \(t+1\) 种向后走的边。所以 \(F'\) 的建图实际上就是一个环。

顺理成章地,沿用上面破环为链的想法。找到 \(\bmod 15\) 的所有 \(F(i)\) 里最小的,记作 \(F(mn)\)。以 \(mn\) 号点为起点破环为链,得到一条 \(mn\rightarrow mn+15\bmod 12\rightarrow mn+2\cdot (15\bmod 12)\rightarrow\cdots\) 的链,然后在这条链上走一遍,也就是 \(F'(mn+\alpha(15\bmod 12))\leftarrow F(mn)+15\alpha\)

切换一次模数的复杂度是 \(O(\text{点数})\) 的。一共切换 \(\log n\) 次,也是 \(O(n\log n)\)

总共 \(O(n\log n)\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/829436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有DEM,如何在Global Mapper中绘制等高线,并导出至CAD

通常,用无人机航测或其它途径得到的DEM、DSM来绘制等高线,一般流程是将DEM导出至南方CASS或其它格式的高程点文件,再用这些高程点来建立DTM、结三角网、编辑三角网,来进行等高线的绘制,做过等高线生产的测绘兄弟们都清楚,这个过程还是十分繁琐的。实际上,用Global Mappe…

2024-2025-1 20241318 《计算机基础与程序设计》第七周学习总结

这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标 ①数组与链表②基于数组和基于链表实现数据结构③无序表与有序表④树⑤图⑥子程序与参数作业正文 https…

坐标系相关知识科普

四/七参数计算方法及"傻瓜式"转换流程 坐标转换隶属于"大地测量学"的范畴,而大地测量学呢,又是整个测绘学科中最基础、最重要,但知识的理论性最强的一门学科。今天呢,测绘营地将尽量用通俗易懂的语言为大家讲解一下坐标系的区别、几种转换方式、中央子…

Living-Dream 系列笔记 第84期

连通性问题点双连通:在无向图中,删除一个点(不是 \(x\) 或者 \(y\))后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是点双连通的。边双连通:在无向图中,删除一条边后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是边双连通的。性质…

谷歌浏览器最好的视频下载器插件-CocoCut视频下载器

这是我目前遇到最好用的视频下载插件,没有之一。 教程如下:打开播放视频的页面,选择你的插件,点击下载即可。如下图:下载地址:https://chromewebstore.google.com/detail/video-downloader-cococut/ekhbcipncbkfpkaianbjbcbmfehjflpf 官方网址:https://cococut.net 免费…

具有低开关损耗的: FF100R12W1T7EB11 FF300R12ME7PB11 FF75R12W1T7EB11 FF800R12KE7PE IGBT模块,简单了解下它们的资料

FF800R12KE7PE是62 mm 1200 V, 800 A 低饱和压降的Fast trench IGBT半桥模块,采用TRENCHSTOP™ IGBT7和发射极控制第7代二极管。关于英飞凌IGBT模块:这些产品组合包括不同的先进IGBT功率模块产品系列,它们拥有不同的电路结构、芯片配置和电流电压等级,适用于几乎所有应用。…

程序员 SEO 系列:如何找到更多搜索关键词?

本文分享有效的关键词挖掘策略,帮助你识别低竞争、高流量的蓝海关键词,提升网站排名并带来持续流量增长。了解如何通过竞品分析、长尾词挖掘等方法,发掘适合你网站的关键词,快速提升 SEO 效果。 一、关键词研究(挖词)的目的? SEO 挖词的目的是通过深入 Research 和识别有…

agc032 A~E 题解

a 倒推,每次删掉最后一个b[i]=i的即可 b 一开始发现可以构造完全二分图,使两边和同为S,这样每个点的和=对面二分图点的和=S,然后n=6和为奇数 进一步发现可以直接分成A组组内和为B的组,然后组之间连边,此时S=(A-1)B,有AB=n(n+1)/2 当n为奇数时取A=(n+1)/2,B=n,n单独一组…

devc++配置opengl库

由于VisualStudio太占内存,所以用老古董devc++配图形学的环境。 用到的文件下载链接 Step1:建项目 首先打开dev 点文件--新建--项目--Multimedia--OpenGL c++/c都行(我这里用的c++) 名称最好用英文,然后确定,保存的地方也最好没有中文路径 Step2:添加库文件 找到DEV-C++的…

达梦数据库DM Exception字符串截断错误,略坑~

前言 我之前在使用达梦数据库的时候,遇到了很多很多的问题,主要对达梦数据库也不是很熟悉,它的语法和我所熟悉的mysql和postgresql有很大的区别。 今天,讲一下我之前遇到的一个问题。这个问题的起因是用达梦数据库迁移工具,将数据库从postgresql迁移到达梦数据库。迁移之后…

引用

引用就是给变量起另外的名字,区别就是在别名前加&的符号。实质上指向同一个内存。引用的两个注意事项: 1.引用必须初始化。 2.引用初始化后不可以更改。引用做函数参数就太熟悉了,引用作函数返回值倒是没见过。 1.不能返回局部变量作为引用,任何和局部变量地址相关的操…

element-ui-plus给头像avatar增加头像框

template部分:<el-avatar shape="square" :size="50" :fit="fit":src="avatarImg"class="avatar-with-border-image"/>style部分:.avatar-with-border-image {position: relative;margin-top: 5px;margin-left: 5vh…