1 条题解
-
0
题意回顾
- 小写字母 – 对应 ASCII 码 97–122,转为 8 位二进制。
- 一个长度为 的字符串 被转成 位的二进制串。
- 二进制串的比特顺序被打乱(即 0/1 的个数不变,但顺序随机)。
- 要求还原出原字母串或判断无解。
数据范围:。
关键观察
1. 字母的二进制特征
小写字母 ASCII 码范围 97–122,二进制形式特点:
- 最高位(第 8 位)总是
0(因为 97–122 < 128) - 第 7 位总是
1(因为 97–122 ≥ 64) - 所以每个字母的 8 位二进制形如
01xxxxxx,其中x是 0 或 1。
具体来说:
- 97 =
01100001 - 122 =
01111010
2. 统计约束
设输入 01 串中:
0的总数 =1的总数 =
由于每个字母的二进制有:
- 固定 1 个
0在第 8 位 - 固定 1 个
1在第 7 位 - 其余 6 位中:
0的个数可以是 0–6,1的个数 = 6 - (0的个数)
所以对于 个字母:
- 总
0数 = (来自最高位) + 其余位的0数 - 总
1数 = (来自第 7 位) + 其余位的1数
设其余 6n 位中
0的个数为 ,则: $ cnt_0 = n + z,\quad cnt_1 = n + (6n - z) = 7n - z $ 因此: 并且: 所以: 必须是整数且在 之间,否则无解。
3. 可行性条件
设每个字母的其余 6 位中有 个
0,则: 并且每个字母的 ASCII 码必须在 97–122 之间。ASCII 码值 = (其余 6 位的整数值),范围 64–127。
但字母范围是 97–122,所以其余 6 位的值必须在 33–58 之间(因为 97-64=33, 122-64=58)。
4. 其余 6 位的值范围
其余 6 位看作 6 位无符号整数,范围 0–63。
但字母要求该值在 33–58 之间(十进制)。二进制看:33 =
100001,58 =111010。
所以其余 6 位的二进制必须满足数值在 33–58 之间。
问题转化
我们已知:
- 总 0 数 ,总 1 数
- 其余 6n 位中 0 的个数
- 需要将 个 0 分配到 个 6 位组中,每个组 0 的个数 ,且该 6 位二进制数值在 33–58 之间。
构造解法
1. 检查必要条件
- 是整数且
- 存在 个 且 ,且对应数值在 33–58 之间
2. 判断是否存在这样的
我们检查每个可能的 (0–6)对应的数值范围是否与 [33,58] 有交集。
= 其余 6 位中 0 的个数,那么 1 的个数 = 。
数值范围:最小是 把 1 放在高位,例如 时是 63(
111111), 时是 0(000000)。
但我们需要数值在 33–58 之间。实际上,数值 = 6 位二进制数的十进制值。我们枚举 ,列出所有 6 位二进制数中 0 的个数为 且值在 33–58 之间的那些。
3. 枚举验证
手工枚举(或程序预处理):
- : 只有
111111=63,不在 [33,58] → 不可行 - : 有
111110=62,111101=61, ..., 最小是011111=31,最大 63,但 31<33,所以可能没有在 [33,58] 之间的?检查:101111=47,110111=55,111011=59,111101=61,111110=62,只有 47,55 在范围内。所以 可行。 - : 例如
110111=55,101111=47,100111=39,011011=27(<33),101011=43,110011=51,111001=57,111010=58,111100=60(>58) 等,有很多在 [33,58] 之间。 - : 也有很多,如
101010=42,101100=44,110010=50,110100=52,101001=41 等。 - : 如
100110=38,101000=40,100101=37,100011=35,010110=22(<33) 等,较少但存在。 - : 如
100010=34,100001=33,010010=18(<33) 等,只有 33,34 可行。 - : 只有
000000=0,不在范围。
所以可行的 值集合 。
4. 构造分配
我们需要将 分配到 个位置,每个位置取值在 中。
这是经典的可行性分配问题:
设 ,。
可行当且仅当 。因为我们可以用 和 调整总和:先全填 ,然后逐个增加至 直到总和达到 。
所以条件:。
由于 ,所以 ,即: 这就是最终的可解条件。
5. 构造字母
一旦 ,我们一定可以构造出 个字母:
- 先给每个字母分配 (总和 = )
- 需要增加 个 0,每次将一个字母的 从 1 增加到 2,3,4,5,每次增加 1–4 个 0
- 总能调整到总和 =
并且每个 都对应至少一个在 97–122 之间的 ASCII 字符。
算法步骤
- 读入 和 01 串
- 统计 和
- 检查 且
- 若不满足,输出
NIE - 否则:
- 计算
- 确定每个位置的 :先全 1,然后增加直到总和
- 对每个 ,选一个对应的合法字母输出
复杂度
- 统计:
- 构造:
- 总
总结
本题的关键在于:
- 发现小写字母二进制格式固定(
01xxxxxx) - 转化为其余 6 位的 0 的个数分配问题
- 推导出可解条件
- 构造时利用 都有合法字母的性质
这样可在 时间内解决问题。
- 1
信息
- ID
- 4442
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者