P16516 [GKS 2015 #D] IP Address Summarization

题目描述

IP(Internet Protocol,互联网协议)地址是分配给互联网上每台设备的一个数字。目前,大多数设备使用该协议的第四版本(IPv4)。一个 IPv4 地址是一个 $32$ 位的二进制串。IPv4 地址通常以点分十进制表示法来表示,该表示法由四个称为“八位组”的十进制数组成,每个数的范围是 $0$ 到 $255$(含),各组之间以点号分隔,例如 $172.16.254.1$。每个八位组代表该地址中的一组 $8$ 位(一个字节)。该二进制串的前 $8$ 位(当解释为无符号整数时,最高有效位在前)构成第一个八位组,接下来的 $8$ 位构成第二个八位组,依此类推。 一个 IP 子网地址用于表示属于同一网络的一组设备。IP 子网地址以 IP 地址后跟一个斜杠,再接一个范围从 $0$ 到 $32$ 的前缀长度来表示。一个子网地址代表所有与给定地址具有相同前 $P$ 位的 IP 地址,其中 $P$ 是前缀长度。例如,$10.8.0.0/9$ 代表 $2^{23}$ 个地址,它们的前 $9$ 位均为 $000010100$(即 $10.8.0.0$ 的前九位),也就是从 $10.0.0.0$ 到 $10.127.255.255$。注意,$10.8.0.0/9$ 与例如 $10.0.0.0/9$(或该子网内的任何其他地址)都是指代同一子网的等价方式,因为这些地址的前九位相同。 如果一个子网中除前缀以外的地址位均为零,则称该子网是**规范化的**。例如,$10.8.1.0/24$ 和 $10.8.1.2/24$ 代表同一子网,但 $10.8.1.0/24$ 是规范化的。$255.255.255.255/13$ 的规范化形式是 $255.248.0.0/13$。 你将获得一个子网地址的列表,你需要输出一个最短的有序子网列表,使得所有地址都是规范化的,并且一个地址属于输入中的某个子网当且仅当它属于输出中的某个子网。

输入格式

输入的第一行给出测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例以一行包含一个整数 $N$(表示子网的数量)开始,随后是 $N$ 行,每行包含一个子网地址。每个子网地址的格式为 A.B.C.D/P,其中 A、B、C 和 D 是 $0$ 到 $255$(含)的整数,P 是 $0$ 到 $32$(含)的整数。任何整数(除 $0$ 本身外)都没有前导零。

输出格式

对于每个测试用例,输出一行形如 `Case #x:` 的内容,其中 $x$ 是测试用例编号(从 $1$ 开始)。然后输出满足上述条件的子网地址列表,每行一个。这些地址必须是规范化的,并且必须有序。一个地址 X 在另一个地址 Y 之前,如果 X 的第一个整数小于 Y 的第一个整数,或者 X 与 Y 的第一个整数相同但 X 的第二个整数小于 Y 的第二个整数,依此类推。 注意,问题的要求保证每个测试用例都有唯一的答案。

说明/提示

### 限制 $1 \le T \le 50$。 **小数据集(测试集 1 - 可见)** $1 \le N \le 10$。 **大数据集(测试集 2 - 隐藏)** $1 \le N \le 10000$。 翻译由 DeepSeek V4 Pro 完成