2026/3/2

补一些一句话题解。刚学的复习一下。

CF1535F

首先可以按照字符集是否相等划分连通块,块内独立,然后注意到块内距离是不超过 \(2\) 的。因为 \(a\) 排个序,\(b\) 排个序。

然后考虑什么时候距离为 \(1\)。注意到我只需要对每个串,求出一些极长 non-decreasing 段,那么就变成了,我固定 \(i\),枚举这些段,寻找所有的 \(j\) 使得能够匹配上剩下的前缀后缀。
仿照 CSP-S 2025 T3 replace 正反 trie 二维数点。

CF1801G

AC 自动机上走一遍,前缀和相减,为什么错?

考虑在 \([l, r]\) 中找到最大的 \(p\),使得存在一个以 \(p\) 为结尾的 occurence,这个 occurence 的左端点溢出了 \(l\)
那么 \((p, r]\) 是可以直接前缀和相减算答案的。找 \(p\) 的话,先 ACAM 跑一遍再线段树二分。

那么对于剩下的,根据 \(p\) 的定义,\([l,p]\) 是某个模式串的后缀。那么对所有的模式串的所有后缀预处理即可。(反着建一个 ACAM)
思路还是比较有启发性的。

CF1110H

首先这个 \([l, r]\) 的限制讨厌,怎么去掉?类似数位 DP 的手法,可以给 \([l, r]\) 拆成若干个限制,每个限制形如:

  • 匹配了 \(\texttt{xxx\$\$\$}\),那么得分加一。\(\texttt x\) 为数字,\(\texttt \$\) 为通配符。注意要顶满这个串的长度才能加分。

这样的限制只会有 \(O(\log l+\log r)\) 个,建出 ACAM,在上面 DP 即可。
额写的时候不用真的弄通配符,DP 的时候稍微改一下转移就好了。
字典序最小的方案随便搞。

CF917E

写代码是不可能的。/hanx
淀粉。
那么对于一条路径,拆贡献。考虑一条路径 \((x, y)\) 经过分治中心 \(rt\),询问 \(s_k\)。那么对于 \(s_k\) 仅在 \(x\to rt\)\(rt\to y\) 的 occurences,ACAM 上跑一遍就好了。

对于跨过分治中心的 occurences,暴力枚举 \(s_k\) 的断点,分成一个前缀和一个后缀。
具体地,对分治中心下面的所有子串 \(rt\to i\),建出 trie 树,那么上面前缀的限制,就相当于查,我这个子树里面有没有出现过 \(x\)。启发式合并桶数组?怎么搞一下都行。

复杂度分析?额看起来我要是每次都询问一个很长的 \(s_k\) 就爆了。
但是考虑到 \(s_k>\sqrt n\) 时,只会出现在 \(O(\sqrt n)\) 个不同的分治中心中!复杂度就有保障了。
总复杂度 \(O(n\sqrt n)\),因为 \(O(\operatorname{poly} \log)<O(\sqrt n)\),视一堆东西同阶。

CF914F

又是一个 trick 喵。
对每个字符维护一个 bitset 表示这个字符的出现位置。

然后查询的时候,对 \(s\) 的每一位,取出 bitset,位移一下与起来。

CF786D

石。战术不写代码。

考虑点分治。考虑每个询问的 \(x\) 满足(路径 \((x, y)\) 不一定跨过分治中心 \(c\)),且 \(x\) 在分治中心的子树里(\(y\) 不一定在),且贡献点 \(z\) 在和 \(x\) 不同子树中,的贡献。
那么 \(s[x, z]\) 可以被拆成 \(s[x,c]+s[c,z]\),先比较 \((x, y)\)\((x, c)\),取出 LCP,做一些讨论。发现只有 \((x,c)\)\((x, y)\) 的前缀的时候需要进一步处理。

\((x, c)\) 被匹配到了 \((x, w)\),那么进一步需要比较 \((w,y)\)\((c,z)\) 的大小。
那么对于 \(c\) 的每个后代,建出 Trie。那需要在 Trie 上面走一趟。如何加速?
那么要在求 \((w, y)\) 和 Trie 的 LCP。经典地,二分哈希,用 hash table
存下来 Trie 每一层的 hash 值。
时间复杂度是两到三个老哥的。

posted @ 2026-03-02 16:09  Water_M  阅读(11)  评论(0)    收藏  举报