CF 1202 题解
这场ABC都是Div2 ABC种偏难的。。但是后面难度就上不去了(可能是我只会做一点点套路题的原因?)
A
这里的反转是 reverse,不是取反。。自闭了。。
设这两个数是 \(a,b\),其中 \(a > b\),由于字典序最小,所以我们从低位向高位看,要求尽量是 \(0\)。
我们找到 \(b\) 的 \(\text{lowbit}\) \(p\),发现比 \(p\) 低的位都是无法改变的(由 \(a\) 决定),我们可以通过一些移动,让 \(p\) 对齐比它高的某个 \(a\) 上的 \(1\),消去这个 \(1\)。按照字典序的贪心策略,就找比 \(p\) 高的第一个位置就行了。
比如样例的第二组数据:
10001
110
b 的 lowbit 是从低到高第二位,我们让它消去能到达的最近的位(a 的最高位)
0010001
0110
1000001
reverse: 1000001
B
相当于在 \(\bmod 10\) 下加法,只需要预处理 \(f_{a,b,c}\) 表示满足 \(ax+by = c \pmod {10},a \geq 0,b \geq 0\) 的最小的 \(x+y\) 就行了。这个可以对于每个 \((a,b)\) 跑个 bfs。
那么每次就暴力模拟走就行了。注意 \(f_{a,b,0}\) 不一定是 \(0\),所以最初 bfs 的时候应该将 \(f_{a,b,a},f_{a,b,b} = 1\),然后把 \(a,b\) 扔进队列扩展。
C
行列独立,现在转化为一维问题。
现在我们要判断是否能通过增加一个操作使得影响区间长度 \(-1\)。
我们分类讨论是要减少最大值还是增加最小值:以减少最大值为例,如果在时间 \(p\) 加入一个操作,必须要满足 \(p\) 前面没有出现过最大值,后面没有出现过最小值(这样能保证所有最大值都被 \(p\) 影响,并且所有最小值不会被 \(p\) 影响而导致 \(-1\)),所以求出来最大值时间轴上的最小位置,和最小值时间轴上的最大值,判断一下中间是否能放就行了(注意最大值和最小值紧挨着是不合法的)
D
一种基本思路是构造 1333.....3337
,设 \(3\) 的个数为 \(x\),答案就是 \(\binom x 2\)。
我们将 \(n\) 分解为若干个 \(\sum_{i=1}^m \binom {x_i} 2\) 的形式,我们只需要在对应 \(x_i\) 的位置插入 7
就好了。
比如:\(8 = \binom 4 2 + \binom 2 1 + \binom 2 1\),对应的序列是 13377337
。
E
感觉全场最简单题。。
先枚举分割点 \(i\),如果求出 \(pre_i,suf_i\) 表示匹配到 \(i\) 前缀结尾/\(i\) 后缀开头的串有多少个,对答案的贡献就是 \(pre_i \times suf_{i+1}\)。
\(pre_i\) 可以对小串建 AC 自动机,就是 fail 树上到根的标记和。\(suf_i\) 对反串做就行了。
注意:AC自动机 不保证 \(fail_i \leq i\),所以统计 fail 树信息请手动建树!!
F
引理 \(1\):对于任何 \(|\Sigma| \geq 2\) 的串,一定存在一种重排列方式满足其最小正周期为 \(n\)。
这个显然,直接排序就行了。
设 \(n = a+b\),我们首先枚举一个 \(k\) 观察如何检查答案。
那么相当于 \(k\) 个分成一段,我们可以求出整段个数 \(g = \lfloor \frac{n}{k} \rfloor\)。
那么设第一段用了 \(x\) 个 A
,\(y\) 个 B
,首先我们要保证 \(k=x+y\),然后为了保证数量够,有限制 \(xg \leq a,yg \leq b\),然后我们要保证最后一段能拼成前面的一部分周期,于是还有 \(a-xg \leq x,b-yg \leq y\),解出来是
我们对 \(g\) 除法分块,用上面的不等式可以得到 \(k=x+y\) 的限制,算一下交就行了。