2025 贵阳 代码源 Day 6

Day 6

A Codeforces 176B Word Cut

把题目的拆分操作理解成循环重构就好做了,发现可以 dp,\(f_{i,j}\) 表示序列循环重构 \(i\) 次后的样子,用了 \(j\) 步,发现所有的 \(f_{i},i:=1\to n-1\) 都相等,只有 \(f_0\) 不等,所以再优化 \(f_{0/1,j}\) dp就好。

B 洛谷 P4824 Censoring S

用栈,栈中的元素表示还剩下的元素,只在栈上跑 kmp 就好,记录下每个 \(i\) 对应的 \(j\),当在栈上发现有匹配之后就弹出栈顶的 \(|T|\) 个元素然后接着新的栈顶继续跑 kmp.

C CodeForces 1721E Prefix Function Queries

发现正常 kmp 只是均摊 \(O(1)\),如果多次重复还是会炸,于是使用 kmp 自动机,也就是我们将普通 kmp 的 \(fail_i\) 数组改成 \(nxt_{i,w}\),表示 \(i\) 的下一个字符是 \(w\) 时的 \(nxt\),这样单次复杂度 \(O(w)\),对每个 \(t\) 单独做即可。

D CodeForces 898F Restoring the Expression

发现枚举了任意一个断点后剩下的一个断点只有 \(4\) 种可能,这样 \(O(n)\) 枚举每一种可能区间然后用字符串哈希做就好。

因为要求在十进制下加和,所以用 \(10\) 做哈希的底数,双带模就能防止哈希冲突。

E 洛谷 P8131 Gene Folding

看到回文想到 manacher,发现合并只会从左一直连续合并到某个点同时从右一直连续合并到某个点,可以发现两者互不干扰,便分别统计出左端点可能的位置和右端点可能的位置,枚举其中一个对另一个二分即可。

posted @ 2025-07-26 19:41  2020luke  阅读(16)  评论(0)    收藏  举报