Untitled-1

只记录有教育意义的题。

CF898F

首先考虑如何快速 check 是否合法,即判断 \(a+b=c\),这个东西理论上需要准备 \(10^5\) 个素数判余数相同,但是直接使用 \(O(1)\) 个竟然是对的!

然后就简单了,根据加法的性质,枚举 \(c\) 后只要枚举 \(\le 3\)\(a\) 即可。

CF1721E

kmp 自动机。实际上就是记录前缀 \(i\) 后面插入 \(c\) 后会转移到哪个前缀(单串 AC 自动机?)。

CF1310C

对所有子串排序,然后二分。问题转化为求分成 \(m\) 段,每段字典序 \(> S\) 的方案数。

观察到以 \(i\) 为左端点,字典序 \(> S\) 的子串的右端点 \(j\) 是一段后缀。

那么设 \(dp_{i,j}\) 表示 \(i\) 后缀,分 \(j\) 段的方案数,配合后缀和优化转移即可。

P4696

很久以前就会的套路,现在才用上。

考虑题目实际上定义了一个字符串等价关系,所以可以使用 kmp 算法。

\(p \leftarrow p^{-1}\),那么 \(h\)\(p\) 等价实际上是排名数组完全一样。

在加入字符 \(h_j\) 时,我们需要判断 \(h_j\) 的排名是否为 \(p_i\) 的排名。

这个显然可以用主席树维护,但是利用前面导出的相等关系,可以更加简洁的维护。

具体地,对 \(p\) 的每个前缀 \([1,i]\) 求出 \(i\) 的前驱 \(i - pre_i\) 和后继 \(i - suf_i\)

由于 \(h_j\)\(p_i\) 前面的字符串是完全等价的,所以 \(h_j\in[h_{j - pre_i}, h_{j-suf_i}]\)。容易验证这是充要的,时间复杂度 \(\mathcal O(n)\)

posted @ 2025-07-26 18:58  Cynops  阅读(13)  评论(0)    收藏  举报

Loading