CF1817 题解

D:手玩前一半和后一半。

E:

注意到最后策略一定是把序列砍成两半,然后前一半合并,后一半合并。

容易发现只有三类选择方案,即左边选一个,右边选一个,或者是从中间的长度为 log 的段里选一个位置劈开。

如果从中间劈开,只需考虑一个较小的中间的子段比大小就行。由此可以做到线性。

(通过分治可以发现这一点。)

F:

比较神秘。

建立 sam,考虑对串 S 计数能劈成多少个合法的 \(acb\)

显然 \(b\)\(S\) 需要共用一个节点。

考察 \(a\) 的限制,\(a\) 需要沿着 sam 的转移边能走到 \(S\),而且每一步都要求出现次数相同。

如果只保留满足出现次数相同的转移边,就得到了一个森林。

于是考察 \(a\) 对应节点对 \(S\) 产生的贡献。

首先你可以任选 \(a\) 的长度,贡献有 \((len_a-len_{p_a})\)

其次我们知道 \(a\)\(S\) 的后缀长度差就是之间的距离 \(dis\),由于 \(b\) 至少要保留 \(len_{p_b}+1\) 的长度,因此有系数 \(dis-len_{p_b}\)

注意到如果沿着树根移动 \(S\)\(dis\) 每次增大 \(1\)\(len_{p_b}\) 每次不会增大超过 \(1\),因此可以简单维护。

即使没有这个性质也能直接线段树。

posted @ 2023-04-30 16:49  一般通过小萌新  阅读(68)  评论(0编辑  收藏  举报