CCF认证 201812-3CIDR合并-带注释

本文详细介绍了2018年CCF认证中关于CIDR(Classless Inter-Domain Routing)的部分,结合具体实例探讨了如何进行CIDR的合并操作,并提供了详细的注释辅助理解。
摘要由CSDN通过智能技术生成
/*
1、排序:IP作为第一关键字,前缀长度作为第二关键字
2、从小到大合并:考虑相邻元素,但是需要注意,要知道他们的表示范围,要能判断包含关系
3、同级合并: 要能求并集。
*/
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
//存储结构
typedef struct {
	string ip="";
	ll length=0;
	ll min;
	ll max;
	ll sum=0;
} IP;
list<IP> ip;
ll n;
string sub="/", dot=".";
const ll one=1;
//判断a是否是b的子集
bool isSubset(const IP a, const IP b) {
	if(a.length<b.length) {
		//有效长度越大,集合越小,集合要是小了,那肯定不能是父集了
		return false;
	}
	if(a.min>=b.min&&a.max<=b.max) {
		return true;
	} else {
		return false;
	}
}

bool canMerge(const IP&a, const IP&b) {
	IP c=a;
	c.length-=1;
	//offset:低offset要全部为0才算合法ip
	ll offset=32-c.length;
	//首先判断是否合法,一个是长度,另一个是看是否能保证低offset位为0
	if(c.length<1 || c.sum!=((c.sum>>offset)<<offset)) {
		return false
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值