#9365. IPv6地址压缩(洛谷 - P2815)
IPv6地址压缩(洛谷 - P2815)
说明
【IPv6 格式】
IPv6 二进位制下为 128 位长度,以 16 位为一组,每组以冒号“:
”隔开,可以分为 8 组,每组以 4 位十六进制方式表示。
比如 2001:0db8:0000:0000:0123:4567:89ab:cdef
是一个合法的 IPv6 地址。
同时 IPv6 地址在某些条件下可以压缩:
- 每组数字代表的独立十六进制数可以省略前位的
0
。
比如上面的 IPv6 地址可被压缩为 2001:db8:0:0:123:4567:89ab:cdef
。
- 可以用双冒号
::
表示一组0
或多组连续的0
,但只能出现一次。
比如上面的 IPv6 地址可被压缩为 2001:db8::123:4567:89ab:cdef
。
请你帮助记忆力不好的网络工程师小明解决他遇到的问题。
【规则补充】
-
输入数据为完全展开的 IPv6 地址,确保输入的 IPv6 地址不含双冒号,每组地址省略的
0
都会被补充上去。 -
双冒号只能使用一次,因此我们压缩最长的全
0
组。
比如 2001:0db8:0000:0000:1:0000:0000:0000
,压缩为 2001:db8:0:0:1::
,而非 2001:db8::1:0:0:0
。
- 双冒号只能使用一次,因此我们在我们遇到地址中多个连续全
0
组长度相同时,我们压缩最前面的一个。
比如 2001:0db8:0000:0000:ffff:0000:0000:1
,压缩为 2001:db8::ffff:0:0:1
,而非 2001:db8:0:0:ffff::1
。
- 输入的 IPv6 地址可能无法被压缩,此时请照原样输出。
提示:本题所示的压缩规则与 macOS (Darwin) 默认的 IPv6 地址显示方式相同,而 Windows 和 Linux 只遇到一组全 0
时不会使用 ::
进行压缩。但用此方法压缩过的 IPv6 地址一样可以被 Windows 和 Linux 正确识别。
比如 2001:0db8:ffff:0000:0123:4567:89ab:cdef
,Darwin 压缩为 2001:db8:ffff::123:4567:89ab:cdef
,而 Linux 和 Windows 压缩为 2001:db8:ffff:0:123:4567:89ab:cdef
。
输入格式
一串 39 个字符的字符串,代表一个完全展开的 IPv6 地址。
输出格式
一串压缩后的 IPv6 地址。
2406:0840:f990:0000:0000:0000:0000:0001
2406:840:f990::1