201812-3 CCF-CSP CIDR合并

基于CY7C68013A芯片的USB2.0设计 基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不... 阅读详情

备注:CCF CSP第三题 题目都很长,会引入其他你没学过的知识,不过给与的解释肯定能看懂,所以这里大家一定需要坚持住, 把题目全部看完,相信自己,我不勇敢谁替我坚强!

样例输入

2
1
2

样例输出

1.0.0.0/8
2.0.0.0/8

样例输入

2
10/9
10.128/9

样例输出

10.0.0.0/8

样例输入

2
0/1
128/1

样例输出

0.0.0.0/0

 

By the way: 这是 CCF CSP 的第三题 ,也是题目特别长,和实际结合特别密切的题目,笔者去年做这一题,虽然看懂了题目,还是感慨自己的编程水平不够,没有得分。这一次再认真阅读完其他人的博客信息,了解了如何解题,参照他人的方法,自己模仿着写出来了,借鉴了别人的代码和学习了他人一些编程的相关函数,学习了 list 双向链表的使用,也算是收货颇多吧。

解题思路:

1、关键就是 解决IP地址、IP前缀问题,我们使用一个结构体来储存,ip和len。题目已经告知输入的IP前缀 一定正确,不过IP地址存在三种情况:标准型、省略长度型、省略后缀型,还是就是为了合并或者排序,我们需要把IP变为2进制,也就是变为32位数,这样就可以使用一个普通的字符串符号比较就可以来判断大小了。

2、为了排序和合并方便,我们采用链表来储存,因为链表便于插入和删除,尤其是合并的删除,十分方便,采用STL中的list容器来储存,我们使用sort函数,重写cmp,将所有结构体储存之后,排序。

3、从小到大合并,我们使用了 Merge1()函数,一个j来遍历,一个i,先判断是否是匹配集,根据len和ip值来判断,这里特别说一下len(掩码), 它要求长度为len的数字必须相同。使用我们判断是否可以匹配,如果可以匹配则删除范围小的,然后j指向下一个,如果不能匹配,则i和j同时指向下一个。

4、同级合并,我们使用了 Merge2()函数,一个j来遍历,一个i,先判断是否为同级,如果为同级,则需要将j删除,然后i需要将len长度减1,同时看见 i之前是否还有元素,如果之前还有元素,需要回退一步,否则继续从i开始考虑(题目提供的解题思路已经给出)。

5、输出 需要 把二进制转换为 十进制进行输出,同时需要注意 输出格式 为标准型。

#include <iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<list>
#include<cctype>
using namespace std;
struct IP {
	string ip="";
	int len = -1;

};
IP toip(string s) {  //得到一个长度为32位的二进制编码字符串
	IP ipadr;
	string ipstr;
	for (int i = 0; i <= s.size(); i++) {   //等于 s.size()是为了 处理为数字仅有 1位的情况
		if (i == s.size() || !isdigit(s[i])) {
			int k = stoi(ipstr);//转化为 数字
			int d = 128;
			while (d > 0) {   //转换为二进制数
				if (k / d) {
					ipadr.ip+= "1";
					k -= d;
				}
				else {
					ipadr.ip += "0";
				}
				d /= 2;
			}
			if (s[i] == '/') {    //结束循环
				ipadr.len = stoi(s.substr(i + 1));//得到ip前缀
				break;     
			}
			ipstr = "";    //归为空
		}
		else ipstr += s[i];   //数字
	}
	if (ipadr.len == -1) {   //省略长度型
		ipadr.len = ipadr.ip.size();
	}
	while(ipadr.ip.size() < 32) {   //省略后缀型
		ipadr.ip += "0";
	}
	return ipadr;

}

bool cmp(const IP &ip1,const IP & ip2) {
	if (ip1.ip == ip2.ip) return ip1.len < ip2.len;
	else return ip1.ip < ip2.ip;
}

bool isChild(IP &a, IP &b) {//判断b是否是a匹配集的子集
	if (a.len > b.len) {    //a的掩码比b长
		return false;
	}
	for (int i = 0; i < a.len; i++) {    //在掩码内看是否匹配
		if (a.ip[i] != b.ip[i]) return false;
	}
	return true;
}
void merge1(list<IP> &l) {
	auto i = l.begin(), j = l.begin(); //让l去下
		++j;// j访问下一个
		while (j != l.end()) {
			if (isChild(*i, *j)) { //如果 j是 i的子集 则把j删除
				j = l.erase(j);   //返回被删除元素的下一个元素位置
			}
			else {
				i++;
				j++;
			}
	}

}
bool Issamelevel(IP &a, IP &b) {//判断a是否和b同级 
	if (a.len != b.len) {
		return false;
	}
	for (int i = 0; i < a.len - 1; i++) {   //前一位
		if (a.ip[i] != b.ip[i]) return false;
	}
	return true;
}
void merge2(list<IP> &l) {
	auto i = l.begin(), j = l.begin();
	j++;
	while (j != l.end()) {
		if (Issamelevel(*i, *j)) {
			j = l.erase(j);
			(*i).len--;
			if (i != l.begin()) {
				i--;
				j--;
			}
		}
		else {
			i++;
			j++;
		}

	}
}

int main()
{
	int n;
	cin >> n;
	list<IP> ipadr;
	while (n--) {
		string s;
		cin >> s;
		ipadr.push_back(toip(s));
	}
	ipadr.sort(cmp);
	

	merge1(ipadr);
	merge2(ipadr);   //得出来 ip 为 32位

	for (auto it = ipadr.begin(); it != ipadr.end();it++) {
		for (int i = 0; i < 4; i++) {  //三部分
			int k = 0;
			for (int j = 0; j < 8; j++)  //8位二进制数转为十进制
			{
				k = k * 2 + ((*it).ip[j + 8 * i] - '0');
			}
			cout << k;
			i < 3 ? cout << "." : cout << "/";
		}
		cout <<(*it).len << endl;
	}

	return 0;
}

 

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码) 本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。 阅读详情

相关推荐

Camera ITS测试

一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g...

wangubuntu的专栏 7784

【CCF-CSP】201812-3 CIDR合并

文本处理、模拟

whaoe_m的博客 283

死磕GMSSL通信-java/Netty系列(二)

Netty-tcnative再linux编译比较好编译,但是再window编译,我尝试了各种办法,总是编译失败,所以我采用半自动的方式进行编译,Netty-tcnative会生成临时文件,直接用vs打开,设置openssl的头文件和静态库路径,然后生成静态库,静态库改个名字放到jar包里边,其实自动编译也是这个原理哈哈O(∩_∩)O。直接传输五个证书的路径吗,之前有的是说要转成x509之类的,转来转去的有点麻烦,这个是直接传输证书路径,由底层gmssl去解析,格式必须是pem格式。然而,若项目已依赖于。

qq_36577699的博客 3025

[CCF/CSP]201812-(3) CIDR合并 C++ 100分

试题名称 代码长度 编程语言 评测结果 得分 时间使用 空间使用 CIDR合并 2.576KB C++ 正确 100 171ms 3.906MB 关键点: 1. 字符串处理 用sscanf( ) 简洁方便 2. IP点分十进制转为32位无符号整数 3. 前缀转为子网掩码。判断能否合并时,ip和子网掩码...

AndrewJoe的博客 718

地下水热耦合模拟FEFLOW建模

2.3 依据讲解内容,练习构建地下水数值模型(例二),学会各种源汇项、边界条件、时间序列、节点参数的添加及模拟结果的导出。对于真实模型,学习如何建立概念模型、数学模型,练习模型的各种参数和源汇项输入,进行溶质运移、水热模拟。3.通过多种实践案例应用,掌握实践工作中常见项目的模型搭建及特殊问题处理方法。4.1学习水热模型抽灌模式,网格剖分、边界条件、初始温度场赋值。3.3练习模型的各种参数和源汇项输入,进行水流和溶质运移模拟。2.掌握水热耦合的模拟方法及典型项目应用问题处理。2.4根据模拟结果,

weixin_55561616的博客 964

HMC5883L磁力计在STM32F4上的I2C驱动与数据校准实战

本文详细介绍了HMC5883L磁力计在STM32F4平台上的I2C驱动开发与数据校准实战。通过解析寄存器配置、数据读取处理和椭圆拟合校准算法,帮助开发者实现精准的地磁测量,特别适用于无人机导航和机器人系统中的航向确定与陀螺仪漂移修正。

2y3u4i5o6p的博客 1037

CSP201812-3 CIDR合并

CSP201812-3 CIDR合并 题目 CSP201812-3 CIDR合并 解题思路 按照题目给出的提示进行解答 考虑合并时,将IP地址转换为长整型的数据判断范围 如果使用vector会超时,因为第三部合并时涉及到大量的删除和插入操作,所以使用list。 代码 #include <bits/stdc++.h> using namespace std; /*列表中包含的IP地址可能存在交集*/ pair<long long int, long long int> ans; str

qq_43725311的博客 252

Xilinx实战-深入AXI UART Lite IP核的配置与调试

本文详细介绍了Xilinx FPGA中AXI UART Lite IP核的配置与调试方法,包括Vivado环境下的IP核设置、关键参数优化、寄存器操作及常见问题排查。通过实战案例和代码示例,帮助开发者快速掌握AXI接口的串口通信技术,提升嵌入式系统开发效率。

weixin_29189377的博客 227

CSP 201812-3 CIDR合并

题目链接 模拟+位运算~ 设置IP前缀结构体: ip,地址表示的十进制数 a,b,c,d,地址对应的四段十进制数 len,地址的前缀长度 首先对输入的字符串操作,存入标准型的地址前缀,然后根据题目后面的三种操作写三个函数即可: 简单排序函数 若 a 包含 b 的匹配集,证明 a.len<b.len,且在 a 的高 a.len 位上和 b 的高 a.len 位一定相等 比较复杂的操作,注意题目说两者前缀长度相同,此时我们需要用一个新的 IP 前缀 a’ 来替代现有的,题目讲得很清楚,将 a 的前

旺崽的博客 2118

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3051

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

【AI智能体】Codex 浏览器操作自动化任务实战操作详解

congge 4091

CSP CCF: 201812-3 CIDR合并 (C++)

目录题目来源数据特点题目提示知识点注意点20分 题目来源 CIDR合并 数据特点 题目提示 知识点 注意点 20分 数据特点: 测试点1、2输入中只有标准型的IP前缀(输入中无省略情况),IP前缀个数与输入的个数相同(不需要处理合并的情况, 只需要排序)。 解决方案: xxxx ...

qq_45936312的博客 536

汇川Easy系列斜坡函数功能块(支持状态输出)

IN rSetValue REAL 0.000000 0.000000 不保持 目标值 1IN rMaxValue REAL 0.000000 0.000000 不保持 最大目标值 2IN rMinValue REAL 0.000000 0.000000 不保持 最小目标值 3IN rSmoothTime REAL 100.000000 100.0000 不保持 最小到最大值平滑时间 单位 秒 4IN diTs DINT 10 10 不保持 函数调用周期采样时间中断时间 5。

RXXW_Dor的博客 457

CCF CSP认证201812-3 CIDR合并

201812-3 CIDR合并 题目 思路 用long long或者unsigned类型来存储ip地址前缀,再用len表示长度。 结构体 struct cidr{ int len; long long ip;//我担心unsigned出错,用的long long bool operator <(const cidr &c) const{//用来排序的比较函数 ...

weixin_43944910的博客 394

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ccf csp 201812-3 CIDR合并

我使用了to_string()函数,所以提交的时候,请选择c++11标准,不然会出现编译报错。 先附上80分代码,之后再补完整版。 #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;set&gt; #include&lt;string&gt; #include&lt;algorithm&gt; #include&lt;cc...

lalala_HFUT的博客 754

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CCF CSP201812-3 CIDR合并

题目来源于CCFCSP 思路分析 读懂题目很关键。 思路在题目中已经给出。 但是超时的问题不知道怎么解决。 代码分析 #include<iostream> #include<algorithm> #include<vector> #include<string> using namespace std; vector<pair<string, int>> vec; /* 10进制ip转为二进制ip表示 */ void

计算机科学与技术专业学生的成长之路 487

CCF CSP 竞赛试题——CIDR合并(201812-3)

#include <iostream> #include <string> #include <stdio.h> #include <cctype> #include <list> using namespace std; struct CIDR { unsigned address; int len; }; CIDR...

Touchig的博客 355

CCF-CSP 201812-3 CIDR合并 80分

原题链接:CCF-CSP 201812-3 CIDR合并 #include <bits/stdc++.h> using namespace std; const int N=1e6+10; #define ll long long struct node { int a3,a2,a1,a0; int len; }ip[N]; bool cmp(node a,node b) { if(a.a3!=b.a3) return a.a3<b.a3; else

想买很多漂亮衣服但是买不起的博客 405

CCF-CSP题解 201812-3 CIDR合并

题目想求与给定前缀列表等价的包含IP前缀数目最少的前缀列表。 首先是怎么存储前缀列表。用一个long long存储IP地址,再存一个前缀长度,封装在一个结构体里\(<ipNum, len>\),方便后面排序等操作。IP前缀有三种输入格式,稍微分情况讨论一下。 接着以\(ipNum\)为第一关键字,\(len\)为第二关键字升序排序。 然后考虑去除匹配集被其它IP前缀包含的IP...

weixin_30675247的博客 213

ccf csp 201812-3 CIDR合并 C++ 90分

题目 解题思路 思路按照官方思路就行了,我主要讲一下实现方式 使用结构体,并重载<符号,用set来维护整个ip列表,可以自动排序,并且以 O(logN)的复杂度 快速删除,插入元素。 如果使用vector数组,删除插入一个元素的复杂度为 0(N),则总复杂度为O(N方),对于 n为1e5的数据大小肯定超时。 第零步:处理输入 步骤1:判断是否有/,有的话则后面数字为前缀长度,否则通过前面的前缀判断前缀长度。 步骤2:处理前缀,用一个int 数组 int staIp[4]; 存前缀。(这样利于结果输出)

HzauTriste的博客 327

CCF-CSP 201812-3 CIDR合并【模拟】(100分)

试题编号: 201812-3 试题名称: CIDR合并 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 样例输入 2 1 2 样例输出 1.0.0.0/8 2.0.0.0/8 样例输入 2 10/9 10.128/9 样例输出 10.0.0.0/8 样例输入 2 0/1 128/1 样例输出 0.0.0.0/0 代码如下(100分): ...

inv0ker的博客 502

CCF-CSP-201812-3 CIDR合并 大模拟 STL 链表 字符串处理

原题链接 #include<iostream> using namespace std; #include<string> #include<cstring> #include<algorithm> #include<list> #define N 100005 int n; struct Node{ string ip; //32位 int len=0; Node(){ } int to_Int() { int

weixin_45448563的博客 142

CCF计算机职业资格考试 201812-3CIDR合并 Python实现

CCF计算机职业资格考试 201812-3CIDR合并 Python实现(1s内无法实现) 题目参考搜索引擎或者官网 代码在官网提交是90分,而CCF-CSP的网站限时 1s 是针对C/C++、Java,考试的时候Python限时是 10s ,所以不必担心超时扣分。 思路题目上都给了: 排列:利用sorted(key=)函数与参数 从小到大合并:e.g. 1011 xxxx的匹配集 ⊂\subs...

qq_44124301的博客 358

CSP201812-3CIDR合并

样例输入 2 1 2 样例输出 1.0.0.0/8 2.0.0.0/8 样例输入 2 10/9 10.128/9 样例输出 10.0.0.0/8 样例输入 2 0/1 128/1 样例输出 0.0.0.0/0 题目分析 本题目要解决的问题有如下三个: 将三种IP前缀化为标准型,并选择正确的存储结构 从小到大合并,需要判断一个前缀的匹配集是否为另一个前缀的匹配集的子集 同级合并,需要判断...

学习记录 616

CCF 认证 201812-4 数据中心(100分)

CCF 认证 201812-4 数据中心(100分) 被12月CCF认证的成绩打击了好久之后,官网出题之后,对自己第四题不相信0分,注释了freopen之后交了一次。100分。 这就非常扎心了。但是还是给了我信心,至少刷题没有白费功夫,还是太粗心了。下次继续!!!       题编号: 201812-4 试题名称: 数据中心 时间限制: 1.0s 内存...

DeathYmz的博客 3484

CCF-CSP认证历年真题解-python语言

持续更新,写一道发一道 第一题和第二题已经写完了,以后开始更新第三题第四题。但是进度不会很快... 第一题 CCF201812-1 小明上学 CCF201809-1 卖菜 CCF201803-1 跳一跳 CCF201712-1 最小差值 CCF201709-1 打酱油 CCF201703-1 分蛋糕 CCF201612-1 中间数 CCF201609-1 最大波动 CC...

SoftwareZhen的博客 3万+

CCF-CSP认证历年真题解

CSP认证考什么怎么考? CCF计算机职业资格认证的每一道试题都十分经典,覆盖现实世界中方方面面的问题。这个历年试题解主要使用C/C++语言编写,将逐步增加Python和Java的解题程序。程序中附有注释,力求解题思路清晰简洁,值得珍藏与模仿。 逐题改写过程中,富文本编辑器写的博客将全部用Markdown编辑器改写。改写的第一题,都增加了Python和Java的解题程序。 2021.04第22次: CCF202104-1 灰度直方图(100分)【计数】 CCF202104-2 邻域均值(100分.

海岛Blog 34万+
上一篇: POJ 1088 滑雪
下一篇: 单工,半双工和全双工有何区别和联系?
木禾DING
博客等级 码龄8年 191粉丝 121原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值