P2815 IPv6地址压缩

题目背景

(友情提示: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

洛谷 P2815 IPv6地址压缩 题解的更多相关文章

  1. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  2. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  3. 洛谷 1052 dp 状态压缩

    洛谷1052 dp 状态压缩 传送门 (https://www.luogu.org/problem/show?pid=1052#sub) 做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一 ...

  4. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  5. 浅谈分治 —— 洛谷P1228 地毯填补问题 题解

    如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...

  6. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  7. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  8. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  9. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

随机推荐

  1. vue实现跨域请求的设置

    vue实现跨域请求,需要在vue.config.js里添加以下设置 proxy: { '/service/rest': { target: 'http://localhost:8080/autotab ...

  2. 好用的数据库字典查看工具SQLToolbelt

    工作中经常为诸多的陌生或没有任何表或者字段说明或者文档庞大数据库和数据库表所烦恼,有以下场景: 1.新进入一家公司,开始接触新的项目,领导给你一大堆文档,在不了解具体逻辑的情况下,除了项目的结构,能让 ...

  3. IIS 图片 JS CSS 500错误

    1.检查站点MIME类型是否可以正常加载

  4. Debian忘记密码重置

    前一阵子因为特殊原因我把一个网站的VPS服务器关闭了,结果竟把SSH密码忘了,也没有使用SSH密钥,因为上面还有网站文件不能选择重装,只能尝试在面板重置,但是面板返回结果一直是404我无法获得重置的密 ...

  5. ASP.NET SignalR 系列(八)之跨域推送

    前面几章讲的都是同域下的推送和订阅.这种讲讲如何跨域 对于SignalR来说,默认是不允许跨域的,因为安全问题.虽如此,但同时提供了跨域方案. 两种跨域方式: 1:JSONP2:CORS JSONP的 ...

  6. nginx 反向代理Jenkins

    进入nginx 配置文件 cd /root/nginx/conf   找到nginx.conf 修改server块内容: server {        listen       80;        ...

  7. Java的Stream流式操作

    前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...

  8. 【转载】UiPath,UiPath教程,UiPath视频教程 RPA

    第一课-UiPath简介 第二课-变量和数据类型第1部分-基础讲解 第二课-变量和数据类型第2部分-实例讲解 第二课-流程控制第1部分-ifelse语句讲解 第二课-流程控制第3部分-高级流程控制语句 ...

  9. Node.js 连接 MongoDB数据库

    安装指令:npm install mongodb var mongodb = require("mongodb");// console.log(mongodb); var Mon ...

  10. Golang: 接收GET和POST参数

    GET 和 POST 是我们最常用的两种请求方式,今天结合前端 axios 请求库来讲一讲,如何在 golang 服务中,正确接收这两种请求的参数信息. 一.搭建一个简单的服务 首先,我们来创建一个最 ...