CF645
A. Amity Assessment
模拟即可。
B. Mischievous Mess Makers
每次交换 \(i\) 和 \(n - i + 1\) 即可。
C. Enduring Exodus
二分答案即可。
D. Robot Rapping Results Report
二分答案后拓扑排序即可。
E. Intellectual Inquiry
给你字符集 \(\Sigma\) 和一个长度为 \(m\) 的字符串 \(s\),你需要在 \(s\) 后面加上 \(n\) 个字符,最大化新的字符串的本质不同子序列数量。\(n,m \leq {10}^6\)。2s / 250M。
对于 \(n = 0\) 的情况,问题变为求出原字符串的本质不同子序列数量。发现需要统计的东西没有很好的性质,考虑加强限制。对于每一类本质相同的子序列,我们只在其第一次出现时统计,也就是只在末尾最靠前的那个子序列处统计。举个例子,对于字符串 \(\texttt{abcbac}\),考虑 \(\texttt{abc}\) 这一类,有子序列 \((1,2,3),(1,2,6)\) 和 \((1,4,6)\)。我们只在子序列 \((1,2,3)\) 处统计,其他的就忽视掉。
有了这个性质后,考虑 DP。设 \(f_i\) 表示只考虑前 \(i\) 个字符时本质不同子序列数量。如果 \(s_i\) 在 \(1 \sim i - 1\) 没出现过,那么有 \(f_i = 2 \times f_{i - 1}\),这是因为有选 \(s_i\) 和不选 \(s_i\) 两种情况。如果 \(s_i\) 在 \(1 \sim i - 1\) 出现过,那么就有 \(f_i = 2 \times f_{i - 1} - f_{\text{pre}_i - 1}\)。\(\text{pre}_i\) 表示 \(s_i\) 上次出现的位置。这个比较难理解,我们重点解析一下。
首先还是有选和不选两种情况。不选的话答案还是 \(f_{i - 1}\),这个没什么好说的。要是选,由于我们只统计末尾最靠前的子序列。这意味着,所有末尾位于 \([1, \text{pre}_i - 1]\) 的子序列就都不能统计进去。这是因为它们可以选 \(s_{\text{pre}_i}\),这样末尾是更靠前的。所以说这部分要刨去 \(f_{\text{pre}_i - 1}\),总答案就是 \(f_{i - 1} - f_{\text{pre}_i - 1}\),加上前面不选的也就有转移式 \(f_i = 2 \times f_{i - 1} - f_{\text{pre}_i - 1}\)。
接下来,我们考虑 \(n > 0\) 的情况。在第二个转移式中,有减去 \(f_{\text{pre}_i - 1}\) 的部分。事实上,我们只需要贪心地填满足 \(f_{\text{pre}_i - 1}\) 最小的字符即可。
时间复杂度可以做到 \(O(m + n \lvert \Sigma \rvert )\) 或 \(O(m + n \log { \lvert \Sigma \rvert } )\)。容易通过矩阵快速幂优化至 \(O(m + { \lvert \Sigma \rvert } ^ 3 \log n)\)。
F. Cowslip Collections
莫反题,先略过。

浙公网安备 33010602011771号