闲话 23.3.29

发布时间 2023-03-29 21:35:59作者: joke3579

闲话

好 今天题目到现在才改完
T1 是个 dp 不动转贪心题
T2 是提交答案的构造 但可以随机化半小时出解

所以今天真的放了 INTERNET YAMERO
感觉机房的喇叭放出来就很有感觉呢(
确实好听(

所以今天闲话先水一下!

模拟赛

T3

若一个长度为 \(n\) 的合法串中 0 的个数为 \(a\),则我们知道这串对答案的贡献是 \(\frac{n}{\text{gcd}(a, n)}\):若 \(\gcd(a, n - a) = 1\),则由于循环位移产生的 \(n\) 个新串总是不同的;反之串一定是由 \(\gcd(a, n - a)\) 个相同子串拼成的,这可以由归纳法的思想看出。

打表可以发现,若原串中全是 ?,则答案为 \(\sum_{i} \frac{n}{\gcd(i, n)}\)。我们希望证明的是,对含有相同个数的 0 的所有串来说,合法串在循环同构意义下是唯一的。

设确定的合法串中 0 的个数为 \(a\)1 的个数为 \(n - a\)。我们首先将 \(n\) 除以 \(\gcd(n, a)\),这样我们只讨论一个循环节,并保证 \(\gcd(n, a) = 1\)。对一个串,考虑将 0\(n - a\) 的权值,1\(-a\) 的权值。设单个子串的权值是其中字符权值之和。对整个串来说,权值是 \((n - a) a - a (n - a) = 0\),并且对任意长度为 \(l\) 的子串,子串权值的和都为 \(0\)。然后考虑单个子串的权值。

由于我们只讨论合法串,因此这 \(n\) 个长度为 \(l\) 的循环子串中 0 的个数差值为 \(1\)。设 0 的个数只有 \(k\)\(k+1\) 两种可能,并设含有 \(k + 1\)0 的子串数是 \(p\)

首先考虑 \(p = 0\) 的情况,我们知道这时权值为 \((n - a) k - a (l - k) = nk - al\)。这值显然为 \(0\),因为括号里两个都是 0 的总贡献次数。
反之我们知道 0 的贡献次数为 \(p(k + 1) + (n - p) k = al\),也就是 \(nk - al = -p\)。由于 \(p\in [1, n)\),则 \(nk - al \in (-n, -1]\)。这样两种子串的权值要么是 \(nk - al \in (-n, -1]\),要么是 \(n(k + 1) - al \in (0, n - 1]\)

因此我们知道,任意合法串的子串的权值 \(\in (-n, n)\)

我们设 \(q(i)\) 为合法串前 \(i\) 个字符的权值之和,则合法串的子串 \([l, r]\) 的权值就是 \(q(r) - q(l - 1)\)。因此任意合法串的子串的权值就是 \(\in (-n, n)\) 等价于 \(\forall l, r, \ q(r) - q(l - 1) < n\),即前缀和的极差 \(< n\)

我们枚举极差对应的前缀和数组的值域,设是 \([x, x + n)\)。可以知道,这样的范围总能唯一地对应一个前缀和数组,进而根据双射唯一地对应一个串。这也证明了上面的唯一性。数组可以贪心地构造,由于前一位加上 \(n - a\)\(-a\) 总只有其中一个结果在范围内。因此只需要枚举 \(x\),每次重新得到一个字符串,考虑这个串有多少个循环移位可以和给定的串完全匹配。
这是经典问题,可以用多项式优化到 \(O(n\log n)\) 单次,总 \(O(n^2 \log n)\)

进一步考虑性质,我们不妨先构造 \(x = 0\),随后考虑 \(x \leftarrow x - 1\) 的过程。对每个位置 \(p\) 而言,其前缀和在模 \(n\) 意义下是 \(-ip\)。由于 \(\gcd(n, i) = 1\)\(-ip\) 取遍 \([0, n)\) 的每个值。这样我们在移动时,每次只会有前缀和最大的位置变成前缀和最低的位置,剩下的前缀和值相对大小不变。投射到差分上,也就是这个位置和下一个位置的 01 性取反。所以我们只需要每次翻转 \(O(1)\) 个位置,并维护是否存在匹配。
这自然可以 \(O(n)\) 单次,总 \(O(n^2)\)