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)\)。

浙公网安备 33010602011771号