P2815 IPv6地址压缩

    • 80通过
    • 242提交
  • 题目提供者 chenyy
  • 评测方式 云端评测
  • 标签 字符串 模拟
  • 难度 普及+/提高
  • 时空限制 1000ms / 128MB

题解

  • 提示:收藏到任务计划后,可在首页查看。
  • 最新讨论 显示

    推荐的相关题目 显示

    题目背景

    (友情提示:IPv6基础知识曾多次出现在NOIP初赛中)Internet Protocol,互联网协议,即为我们常说的IP。我们目前常说的IP主要指它的第四版,即IPv4,它由IETF于1981年发布。它的地址长度是32个二进制位,因此也就有2^32个IP地址可供使用,约为43亿,在当时,谁也没有料想到IPv4如此庞大的地址长度会有用完的一天。

    在21世纪的今天,互联网的蓬勃发展早就了我们如今便利的生活。当下,世界人口已超过70亿,计算机和各种联网设备已经走入千家万户,而不再仅是上个世纪80年代科学家们的工具。此时便出现了人们日益增长的联网设备需要同落后IPv4地址长度之间的矛盾。尽管可以通过网络地址翻译能技术来共享IP地址,临时解决枯竭的问题,但显然不是长久之计。

    IETF也有先见之明,早早地于1998年发布了IPv6协议,从微软2006年发布的Windows Vista开始成为默认安装的网络协议。作为IPv4的继任者,它的地址长度为128个二进制位,也就是2^128个IP地址可供使用。然而面对这冗长的地址,一位记忆力不好的网络工程师小明在配置路由表时遇到了许许多多多的困难,现在他找到了你,希望你帮忙编写一个程序来按照IPv6地址标准的格式压缩规则来压缩IPv6地址。

    题目描述

    IPv6格式

    IPv6二进位制下为128位长度,以16位为一组,每组以冒号“:”隔开,可以分为8组,每组以4位十六进制方式表示。

    例如:2001:0db8:0000:0000:0123:4567:89ab:cdef 是一个合法的IPv6地址。

    同时IPv6地址在某些条件下可以压缩:

    ①每组数字代表的独立16进制数可以省略前位的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地址

    输入输出样例

    输入样例#1: 复制
    240e:0014:6000:0000:0000:0000:0000:0001
    输出样例#1: 复制
    240e:14:6000::1
    输入样例#2: 复制
    2001:0db8:0000:0000:0000:0000:0000:0001
    输出样例#2: 复制
    2001:db8::1
    输入样例#3: 复制
    2001:4860:4860:0000:0000:0000:0000:8888
    输出样例#3: 复制
    2001:4860:4860::8888
    输入样例#4: 复制
    2400:8900:e000:0010:0000:0000:0000:0000
    输出样例#4: 复制
    2400:8900:e000:10::
    输入样例#5: 复制
    0000:0000:0000:0000:0000:0000:0000:0000
    输出样例#5: 复制
    ::
    输入样例#6: 复制
    0000:0000:0000:0000:0000:0000:0000:0001
    输出样例#6: 复制
    ::1
    输入样例#7: 复制
    2001:0db8:ffff:0000:0123:4567:89ab:cdef
    输出样例#7: 复制
    2001:db8:ffff::123:4567:89ab:cdef
    输入样例#8: 复制
    1234:5678:9abc:def0:1234:5678:9abc:def0
    输出样例#8: 复制
    1234:5678:9abc:def0:1234:5678:9abc:def0
    输入样例#9: 复制
    0001:0000:0000:0000:0000:0000:0000:0001
    输出样例#9: 复制
    1::1
    输入样例#10: 复制
    0000:0000:0000:0000:0000:0000:0001:0002
    输出样例#10: 复制
    ::1:2
    提示
    标程仅供做题后或实在无思路时参考。
    请自觉、自律地使用该功能并请对自己的学习负责。
    如果发现恶意抄袭标程,将按照I类违反进行处理。