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\),因此可以简单维护。
即使没有这个性质也能直接线段树。