CIDR合并
code
#include <iostream> #include <list> #include <sstream> #include <vector> #include <algorithm> #include <cstring> using namespace std; struct IP { string ip; ; friend bool operator<(const IP &i,const IP &j) { ,i.ip.find('/'))); ,j.ip.find('/'))); if(i1!=j1) return i1<=j1; else return i.len<=j.len; } }; int str_to_int(const string &str) { int num; stringstream ss; ss<<str; ss>>num; return num; } void format(IP &ip) { int f=ip.ip.find('/'); string sub; ; if(f!=string::npos) { //先暂存长度 sub=ip.ip.substr(f+,ip.ip.length()-f-); ip.len=str_to_int(sub); //统计点的个数 ; sub=ip.ip; while((f=sub.find('.'))!=string::npos) { sub=sub.substr(f+,sub.length()-f-); ++count_dot; } //补全ip ) { ip.ip.erase(ip.ip.find('/'),ip.ip.length()-ip.ip.find('/')); ;i<-count_dot;++i) ip.ip.append(".0"); ip.ip.append("/").append(to_string(ip.len)); } } else { sub=ip.ip; while((f=sub.find('.'))!=string::npos) { sub=sub.substr(f+,sub.length()-f-); ++count_dot; } ) ;i<-count_dot;++i) ip.ip.append(".0"); ip.ip.append()*)); } //存储标准型的ip中的/len string s=ip.ip.substr(ip.ip.find("/"),ip.ip.length()-ip.ip.find("/")); //存储ip ,ip.ip.find('/')); ip.ip.clear(); char *s2=new char[s1.size()];//要为s2申请空间后才可赋值 strcpy(s2,s1.c_str()); vector<int> v; //取出以'.'分割的数 char *p=strtok(s2,"."); while(p) { v.push_back(str_to_int(p)); p=strtok(NULL,"."); } //变成2进制 string s3; ;i<v.size();++i) { int t=v.at(i); while(t) { s3.append(to_string(t%)); t/=; } } reverse(s3.begin(),s3.end()); ip.ip.append(s3).append(s); delete []s2; } bool check(const IP &i,const IP &j) { if(i.len>i.ip.length()||i.len>j.ip.length()) return false; ,i.len,j.ip,,i.len)==?true:false; } int main() { int n; cin>>n; IP ip; list<IP> l; //1.格式化输入;把所有输入的类型都变成标准型,ip用二进制表示 while(n--) { cin>>ip.ip; format(ip); l.push_back(ip); } l.sort(); //2.从小大大合并 for(auto i=l.begin();i!=l.end();) { list<IP>::iterator next=i; ++next; if(next==l.end()) break; if(check(*i,*next)) l.erase(next); else ++i; } //3.合并同级 for(auto i=l.begin();i!=l.end();) { list<IP>::iterator next=i; ++next; if(next==l.end()) break; IP ip1=*i; IP ip2=*next; &&ip1.ip[ip1.len-]==') { IP tmp=ip1; --(tmp.len); if(check(tmp,ip2)) { l.erase(next); *i=tmp; if(i!=l.begin()) --i; } else ++next; } else ++i; } for(auto i=l.begin();i!=l.end();++i) cout<<(*i).ip<<endl; ; }
CIDR合并的更多相关文章
- CCF 201812-3 CIDR合并
CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...
- CCF-CSP题解 201812-3 CIDR合并
题目想求与给定前缀列表等价的包含IP前缀数目最少的前缀列表. 首先是怎么存储前缀列表.用一个long long存储IP地址,再存一个前缀长度,封装在一个结构体里\(<ipNum, len> ...
- CCF201812-3 CIDR合并
按题意模拟即可...主要CCF吞代码... #include<bits/stdc++.h> #define pb push_back #define mp make_pair #defin ...
- CCF-CSP认证 C++题解目录
持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...
- CIDR
CIDR的介绍: CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类.B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空 ...
- 无分类编址(CIDR)构成超网
CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...
- 第5章 子网划分和CIDR
第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...
- 无分类编址(CIDR,Class Inter-Domain-Routing)
CIDR全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,大家多称之为无分类编址 CIDR的特点 (1)CIDR消除了传统的A类.B类和C类地址以及划分 ...
- IP地址和CIDR
IP地址(IPV4) IPV4的地址是一个32位的二进制数,由网络ID和主机ID两部分组成,用来在网络中唯一的标识一台计算机.IP地址通常用四组3位的十进制数表示,中间用.分割,例如:192.168. ...
随机推荐
- ubuntu GUI程序开机自启设置
在 主目录下,即 $HOME路径下新建 或编辑 .gnomerc 文件,将开机启动脚本写在这里如下:gedit ~/.gnomerc#!/bin/bashcd /home/xxxx/openUI./o ...
- 记录搭建ssm项目
搞java也快3年了,搭建一个ssm居然有点吃力. 参考链接:https://blog.csdn.net/gebitan505/article/details/44455235/ 环境准备:jdk8. ...
- 201621123001《Java程序设计》第1周学习总结
1. 本周学习总结 认识java的三个层次:java语法 面向对象设计能力 应用 . 学习eclipse创建java文件的方法. 学习markdown的基本语法,了解写博客的几种常用形式. 了解JVM ...
- 关于对Access数据库的学习报告
学习Access数据库的报告 一.前言 一开始我对access一窍不通,甚至不知道它是干什么的,后来经过网上资料的查阅对它略有了解.microsoft office access是由微软发布的关联式数 ...
- PCMU G.711U/PCMA G.711A简介
PCMA(G.711A) 类型:Audio 制定者:ITU-T 所需频宽:64Kbps(90.4) 特性:PCMU和PCMA都能提供较好的语音质量,但是它们占用的带宽较高,需要64kbps. 优点:语 ...
- 【Python】unittest-1
一.Unittest 单元测试 将测试结果和期望值作对比 (1) 继承 (2) 引用包 (3) 执行一次test就会调用一次setup和tearDown (4) ...
- 小白学习Python遇到的一些2.7与3.X之间的不同问题
1.输入字母出错问题 原本跟着视频一起学习,currency_str_value=input(‘请输入带单位货币金额’) 但是运行的时候,输入数字就没有问题,只要带上了字母就会报错,后来百度,pyth ...
- 目录文件管理及vim
一.查看(七种看) cat tac nl more less ====================== head tail tail -f 看动态更新尾部的信息 ================= ...
- python logging 模块的应用
对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟悉的应用为何不工作.有时候,你甚至不知道系统运行,是否跟原始设计一致. 在线运行的应用就是黑盒子,需要被跟踪监控.最简单也最重要的方式就是记录日志. ...
- jdk安装和环境配置
public class test{ public static void main(String[] args){ System.out.println("hello world" ...