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

[WC 2016] 论战捆竹竿

果然字符串的终点和字符串没什么关系吗。

不难发现我们每次只会在一个长竹竿后面拼接一个基础的短竹竿来增加长度。假设每次拼接竹竿的重叠部分为 \(p\),显然 \(p\) 是字符串的一个 border。

我们可以把这个字符串的所有 border 求出来,得到一个大小为 \(m\) 的集合 \(\{b_i\}\)。最后要求的就是满足 \(v\in [0,w-n]\),且方程 \(\sum_{i=1}^m b_ix_i=v\) 存在解的 \(v\) 的数量。

好的,后面是一个经典的同余最短路问题,于是我们得到了一个 \(\min{b_i}\times n\) 的解法,但是这个做法是 \(O(n^2)\) 的。

考虑优化这个做法,经典结论是一个字符串的 border 可以划分成 \(\log n\) 段等差数列 \(d_i+c_il_i\)(结论证明较为复杂)。考虑对于每一个 \(i\),求出在 \(\bmod d_i\) 意义下,加入前 \(i\) 个等差数列对应的边后的最短路。

依次加入每个等差数列,计算对最短路的影响。先考虑将原来 \(\bmod d_{i-1}\) 意义下的最短路换成 \(\bmod d_i\) 意义下的最短路,设前后两者对应的最短路数组为 \(f_i,g_i\),可以用 \(f_i+kd_{i-1}\) 去更新 \(g_{(i+kd_{i-1})\bmod d_i}\),其中 \(k\) 是没有限制的。

可以看成每个点 \(i\)\((i+d_{i-1})\bmod d_i\) 连一条有向边,这样整个图显然会划分成 \(\gcd(d_{i-1},d_i)\) 个环,每个环之间独立。这样就很好做了,断环成链复制一遍,然后用环上上一个位置更新当前位置,总复杂度 \(O(n)\)

转化完模数后,考虑用 \(g_{i}+kc_i\) 去更新 \(g_{(i+kc)\bmod d_i}\),其中 \(k\in [0,l]\),还是可以看成每个点 \(i\)\((i+c)\bmod d_i\) 连一条有向边,划分成 \(\gcd(d_i,c)\) 个环,但只能转移一次,最多从前 \(l\) 个位置转移,单调队列 \(O(n)\) 即可。

这样时间复杂度为 \(O(Tn\log n)\)

http://www.jsqmd.com/news/113267/

相关文章:

  • ScopedValue——重塑线程上下文共享模式
  • 差分电压采样
  • 实验6作业
  • 12/19
  • 人形机器人:热成像血管分布图及糖尿病足早期病变预警模型 - 指南
  • Mintlify平台静态资产API跨租户内容注入漏洞分析
  • 如何使用 FPGA 推理大模型 (4) - 运行推理
  • Experiment 6
  • Vulnerability Report: Stack Buffer Overflow in NETGEAR R6200V2
  • P4499 [CTSC2011] 无穷图的桥 题解
  • 102302134陈蔡裔数据采集综合实践
  • 个人电脑本地私有知识库新选择:访答知识库全面解析
  • A2A协议
  • 完整教程:5G与未来智能城市:互联互通的新时代
  • C语言之成绩排序
  • 使用sharedPerences保存app配置文件
  • 如何使用 FPGA 推理大模型 (1) - 简介
  • 如何使用 FPGA 推理大模型 (3) - 硬件平台搭建
  • MST 做题单
  • 使用WPF编写一个Ethernet/IP的主站程序 - 指南
  • 015.洛谷模拟题
  • 速度表情用语中外文对照表
  • 如何使用 FPGA 推理大模型 (2) - 加速核心编写
  • 写在二战考试前一晚
  • 复制文本到剪贴板(跨平台兼容)
  • 分享文件:charles-proxy-4.6.3-win64.msi
  • git如何撤销某个冲突的解决
  • 关于本站
  • 2025年12月金包银品牌TOP10品牌:工艺/品控/售后三维分析,新手避坑首选 - 小白条111
  • 物理验证:你选哪款 DRC/LVS