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. ...
随机推荐
- 对弈的Python学习笔记
#主要序列类型 str list tuple #列表 list ls=[1,2,3,4]#末尾追加ls.append(5) #添加多个,扩展ls.extend([5,6,7]) #在某个位置插入一个值 ...
- DevExpress v18.1新版亮点——Reporting篇(三)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Reporting v18.1 的新功能,快来下载试用新版本 ...
- 关于makefile的生成原理以及make相关命令的使用
一.生成configure过程中各文件之间的关系图 二.详细介绍 autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是con ...
- leetcode第四题:两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 『转』credential Provider 简易改写攻略
本次小学期的题目是windows下的凭证改编.本人负责的是Win7 下的credentials Provider 的编写以及其他杂七杂八的工作.当然给我印象最深的就是credentials provi ...
- es6 常用总结
1.变量 let 声明的变量只在它所在的代码块有效,不允许重复声明 const 声明是一个只读的常量.一旦声明,常量的值就不能改变. const与let的作用域相同,只在声明所在的块级作用域内有效. ...
- box-sizing布局
box-sizing 语法:box-sizing: content-box | border-box | inherit; 参考: https://www.jianshu.com/p/e2eb0d8c ...
- 日期和API
Java1.0对日期和时间的支持只能依赖java.util.Date类,年份的起始选择是1900你那,月份的起始是从0开始计算的.它的返回值中包含了JVM的默认市区CET,即中欧时间.在Java1.1 ...
- 大数据-01-安装Hadoop
环境 服务器:ubuntu-16.04.3-desktop-amd64.iso 创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 本文中会大量使用到sudo ...
- MySQL篇,第一章:数据库知识1
MySQL 数据库 1 一.MySQL概述 1.什么是数据库 数据库是一个存储数据的仓库 2.哪些公司在用数据库 金融机构.购物网站.游戏网站.论坛网站... ... 3.提供 ...