CF250B Restoring IPv6

题目描述

IPv6 地址是一个 128 位的数字。为了方便起见,这个数字被以 16 位为一组分成若干块,以十六进制表示,每一块之间用冒号分隔——共 8 块,每一块由四个十六进制数字组成。如下是一个 IPv6 地址的完整表示方式的例子:“0124:5678:90ab:cdef:0124:5678:90ab:cdef”。我们称这种表示方式为 IPv6 地址的完整格式。 除了完整表示格式外,还存在简写格式。IPv6 地址简写格式允许将每一块的前导零去除,但每一块至少要保留一个数字。例如,一个地址可以这样缩写去零:“a56f:00d3:0000:0124:0001:f19a:1000:0000” $→$ “a56f:d3:0:0124:1:f19a:1000:0”。对于同一 IPv6 地址,去零的方式可能有多种。 有些 IPv6 地址包含连续较长的零块。若有连续的 16 位全零块,可以用“::”表示,这一段可以含有一个或数个连续的全零块。所有全为 0 的 16 位块都会被合并进这段。 下面给出部分合并零块的例子: - “a56f:00d3:0000:0124:0001:0000:0000:0000” $→$ “a56f:00d3:0000:0124:0001::”; - “a56f:0000:0000:0124:0001:0000:1234:0ff0” $→$ “a56f::0124:0001:0000:1234:0ff0”; - “a56f:0000:0000:0000:0001:0000:1234:0ff0” $→$ “a56f:0000::0000:0001:0000:1234:0ff0”; - “a56f:00d3:0000:0124:0001:0000:0000:0000” $→$ “a56f:00d3:0000:0124:0001::0000”; - “0000:0000:0000:0000:0000:0000:0000:0000” $→$ “::”。 每个地址至多只能出现一次“::”缩写,否则有时无法唯一确定“::”到底表示了多少个零块。 去掉前导零且缩写零块后的表示方式称为简写格式。 现在给你若干个简写格式的 IPv6 地址,请你还原成完整格式。

输入格式

第一行包含一个整数 $n$,表示需要还原的 IPv6 地址的个数($1 \leq n \leq 100$)。 接下来的 $n$ 行中,每行包含一个字符串,表示一个 IPv6 地址的简写格式。每个字符串仅包含 “0123456789abcdef:” 这些字符。 保证每个简写地址都是按照题目描述从某个合法完整 IPv6 地址缩写得到的。

输出格式

对于输入中的每一个 IPv6 地址简写形式,按输入顺序依次输出其完整格式。每行输出一个完整 IPv6 地址。

说明/提示

由 ChatGPT 5 翻译