1 条题解
-
0
给出一份有严谨证明的题解。
首先根据 ,感受到浓烈的大分讨气息。
-
显然 中有 的时候无解,否则输出 。
-
- 若 ,不妨设为 ,发现假如有解,必须用一个 把两个 隔开,则要求 ,其中 表示个数,若满足,发现一定有解。
- 首先发现,当选择了一个翻转的串时,若这个串两端相同, 个数不变,否则串内部情况不变,与 拼接到一起的部分可能造成 的个数减 ,与 拼接到一起的个数一定不会减少,这说明单次操作最多减少一个 。总操作数不低于 的个数次。
- 接下来证明一定能使用这个个数次构造出合法解。考虑对于当前存在的一个 ,找到他前或后第一个长度超过 的连续 段,由于有解,一定能够找到。
- 找到之后,考虑选择 段和连续 段最靠近的两个 和 ,并且以他俩作为选择的字符串的端点进行翻转,发现可以把当前 断开,并且不会新增这样的串,一直进行上述操作即可。
- 否则不妨设为 ,考虑相邻两个 构成的串 ,由于他俩之间没有任何其余的 , 这一坨只能是全 或者全 或者前缀 和后缀 这三种情况。
- 发现无论哪种情况,这样的串翻转之后 个数一定少 。
- 扩展到多个相邻 构成的串的情况,上述结论依然成立。
- 再扩展到任意串,发现反转之后 串个数仍然至多少 ,总次数不少于个数次,下面继续构造合法解。
- 考虑找到当前串中最靠前和最靠后的 ,并且选上最前面的 之前的极长的一段连续的 以及最后面的 之后的极长的一段连续的 ,作为我们选择的字符串,发现这样选择,串内部翻转之后 一定减少 ,而且拼接处一定不会新增。
- 综上,无论哪种情况,除无解之外,只需要数出 作为 字串出现的次数即可。
- 若 ,不妨设为 ,发现假如有解,必须用一个 把两个 隔开,则要求 ,其中 表示个数,若满足,发现一定有解。
-
-
、、、 这 种情况本质相同。发现他们具有的性质与上述 串完全一致,所以仍然只需要数 作为子串的出现次数即可。
-
,不妨设为 ,考虑若一个此串被所选串完全包含,翻转之后没有任何变化,所以要是想消掉,显然需要被所选择串的边界分割。
- 考虑首先将任意两个 两两配对,并选取前面的那个末尾的 以及后面那个开头的 ,显然一次性减少 个并且不会新增。
- 如果最后剩下了一个 ,考虑直接选取序列最前面的 那里的位置和当前 的 的位置直接翻转,一定可以将这个消掉,并且不会产生新增。
- 综上,此时答案是 ,其中 是 在 中的出现次数。
-
若 ,不妨设为 ,无解是简单的,考虑相邻的 之间存在的 的数量 ,我们需要做的就是用最少次数使所有 。首先有两个显然结论:
- 如果存在 ,他在任意时刻一定不会变小。
- 对于任意 ,他们在任意时刻不可能变的大于 。
这是因为上述两种情况都会消耗不必要的次数,一定不优。那么我们需要做的就是让所有 向 去匀。
- 发现每次操作可以使 变为 的任意值。
- 对于 ,他需要匀出去 个 。对于 ,可以一次性匀进来 个, 则是 个。
- 显然尽量消耗 的 使最优的,能消耗的数量是 ,其中 表示 的 的数量,直接计算即可。
-
-
- 1
信息
- ID
- 7327
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者