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

CCF CSP认证菜鸟刷题日志 CCF CSP目录(c/c++) 萌新把代码贴出来求大佬指教orz 201312 201312-1 出现次数最多的数 201312-2 ISBN号码 201312-3 最大的矩形 201312-4 有趣的数 201312-5 I’m stuck! 阅读详情
试题名称代码长度编程语言评测结果得分时间使用空间使用
CIDR合并2.576KBC++正确100171ms3.906MB

关键点:

1. 字符串处理    用sscanf( ) 简洁方便

2. IP点分十进制转为32位无符号整数   

3. 前缀转为子网掩码。判断能否合并时,ip和子网掩码作“与”运算更快

4. 用list存储和处理列表。  有大量删除操作,所以用链表,用顺序表的话超时,最多得90分。

#include <stdio.h>
#include <string.h>
#include <string>
#include <list>

using namespace std;

struct IP{
    int prefix;//前缀长度
    unsigned int ip;//ip的32位无符号整数形式
    IP():prefix(-1){}//前缀默认为-1,以此来判断输入的一行中给没给“/前缀”
};

bool sortList(IP a, IP b){// list 的排序规则
    if(a.ip != b.ip){
        return a.ip < b.ip;
    }else if(a.prefix != b.prefix){
        return (a.prefix) < (b.prefix);
    }else{
        return false;
    }
}


unsigned int getMask(int prefix){//根据前缀长度计算子网掩码
    if(prefix==0)
        return 0;
    if(prefix==32)
        return 0xffffffff;
    unsigned int mask=0;
    for(int i =0; i<prefix; i++){//前缀是几,mask的二进制高位就有几个1
        mask = (mask<<1)+1;
    }
    return mask<<(32-prefix);//把这几个1推到高位
}

void setIP(char line[20], list<IP> &ipList){//根据输入的一行字符串,获取ip和前缀

    //dec[4]分别存了ip点分十进制形式的四个十进制数
    //必须初始化为0,否则没读到值的都成了随机数
    unsigned int dec[4]={0};    
    
    char ipstr[20];
    IP tmp;

    //%[^/]表示读取到/停止,如果没有/,则&tmp.prefix读不到值,会保持默认的-1不变
    sscanf(line, "%[^/]/%d", ipstr, &tmp.prefix);

    //sscanf返回了成功读到几个数 
    int cnt = sscanf(ipstr, "%u.%u.%u.%u", &dec[0], &dec[1], &dec[2], &dec[3]);    

    if(tmp.prefix==-1) tmp.prefix=cnt*8;

    //点分十进制转为32位无符号整数
    tmp.ip = (dec[0]<<24) ^ (dec[1]<<16) ^ (dec[2]<<8) ^ dec[3];    

    ipList.push_back(tmp);

}



void printIP(IP ip){//打印一行IP,ip的32位无符号整数转为点分十进制
    unsigned int dec0=0xff000000, dec1=0x00ff0000, dec2=0x0000ff00, dec3=0x000000ff;
    printf("%u.%u.%u.%u/%d", (ip.ip&dec0)>>24, (ip.ip&dec1)>>16, (ip.ip&dec2)>>8, (ip.ip&dec3), ip.prefix);
}

void printipList(list<IP> &ipList){
    for(list<IP>::iterator it = ipList.begin(); it!=ipList.end(); it++){
        printIP(*it);
        printf("\n");
    }
}


void merge1(list<IP> &ipList){//合并能被别的网段包含的ip
    list<IP>::iterator itL;
    list<IP>::iterator itR = ipList.begin();
    itR++;
    for(itL = ipList.begin(); itL!=ipList.end();){

        unsigned int mask = getMask((*itL).prefix);

        if( ((*itL).ip & mask) == ((*itR).ip & mask) ){
            ipList.erase(itR++);//删掉并将itR指向下一个元素
        }else{
            itL++;
            itR++;
        }
    }
}

void merge2(list<IP> &ipList){//将恰好能合并为 前缀-1的网段 的两个网段合并
    list<IP>::iterator itL;
    list<IP>::iterator itR = ipList.begin();
    itR++;
     for(itL = ipList.begin(); itL!=ipList.end();){
        unsigned int mask = getMask((*itL).prefix-1);
        if((*itL).prefix == (*itR).prefix && ((*itL).ip&mask) == ((*itR).ip&mask)){
                (*itL).prefix--;
                ipList.erase(itR++);
                if(itL != ipList.begin()){
                   itL--;
                   itR--;
                }
        }else{
            itL++;
            itR++;
        }

    }
}

int main(){
//    freopen("201812-3-CIDR.txt","r", stdin);

    int n, i;
    char line[20];
    scanf("%d", &n);
    getchar();//吸收掉n后面的回车
    list<IP> ipList;
    for(i=0; i<n; i++){
        gets(line);
        setIP(line, ipList);
    }

    ipList.sort(sortList);

    merge1(ipList);
    merge2(ipList);
    printipList(ipList);
    return 0;
}

 

CCF计算机软件能力认证试题练习:201812-3 CIDR合并 CIDR合并 来源:CCF 标签: 参考资料: 相似题目: 题目 输入 输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。 输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。 接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 106;k=1、2、3 时... 阅读详情

相关推荐

从零构建Elasticsearch MCP代理:自然语言查询背后的技术揭秘

本文深入解析如何从零构建Elasticsearch MCP代理,实现自然语言查询的技术架构与实战应用。通过MCP协议与Elasticsearch的结合,系统能够将自然语言转换为精确的DSL查询,提升非技术用户的数据查询效率。文章详细介绍了核心架构、DSL生成引擎、端到端系统搭建及生产环境最佳实践,为开发者提供全面的技术指南。

lll78的博客 875

CCF201812-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 问题链接:CCF202104-1 灰度直方图 问题简述:(略) 问题分析:按题意进行处理即可,有2次合并处理。 程序说明:(略) 参考链接:(略) 题记:位运算巧妙,输入文本处理简洁。 A

海岛Blog 1284

AutoCAD 2025在Win10/Win11上的官方安装、配置与问题排查全指南

对于需要在 Windows 11 或 Windows 10 系统上部署 AutoCAD 2025 的设计师、工程师和 IT 支持人员来说,一个稳定、合规的安装流程是高效工作的基石。网络上充斥着各种所谓的“免费下载”和“一键安装”教程,但这些资源往往来源不明,可能捆绑恶意软件、导致软件崩溃,甚至引发严重的许可合规风险。本文旨在提供一个清晰、安全、基于官方最佳实践的 AutoCAD 2025 安装与配置指南,重点解决在 Windows 11 和 Windows 10 系统上部署时可能遇到的兼容性问题、安装失败以

weixin_34396103的博客 448

【C++体系】各种网络协议捋不清?一文带你解决

为了准备秋招及春招,现阶段的任务是将所学过的知识进行复习,并串联起来。计算机网络为后续开展网络编程提供支撑,其中的要点包括了IP、UDP、TCP等。

codeslogan 1587

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 575

在树莓派5(8G版)上运行Ollama + LLM

直接上结论,Ollama在树莓派上能安装,且本身运行起来毫无压力,但具体到大语言模型,Deepseek似乎不总是最佳选择。

ki1381的专栏 1648

IP地址CIDR合法性校验

一、问题描述    我们一般用CIDR来表示一段ip地址。CIDR是这样一个字符串:先是一个ipv4的地址的字符串表示,加一个”/“分隔符,再加一个13(含)到27(含)之间的整数。比如“192.128.1.134/25”,表示从192.128.1.128(含)到192.128.1.255(含)的128个ip地址。    “/”前的字段“192.128.1.134”表示该范围内的一个ip地址(不一...

qiki_糖没味儿的程序媛小屋 7713

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

ccf 201812-3 CIDR合并(100分)

提交后得100分的C++程序如下: #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;cstring&gt; #include&lt;vector&gt; #include&lt;algorithm&gt; #include&lt;list&gt; using namespace std; int pow[]={128,64,...

jinduo16的博客 2104

构建栅格地图matlab代码

1 使用MATLAB实现地图栅格化 效果图如下所示 图1 ...

qq_59747472的博客 4517

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1947

CCF-CSP认证历年真题解

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

海岛Blog 34万+

Coze 打通飞书多维表格,实现数据增删改查操作实战详解

基于Coze 打通飞书多维表实现数据录入系统实战详解

congge 5779

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

qq_45936312的博客 536

Camera2Demo

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

CCF CSP入坑指南 (含难度分析 试题目录及答案 部分答案有解析更新至201912 包含全部前四道题解及小部分第五题解)

第一题 基础数据处理,包括大小比较、计数、排序,不超过一层的for循环。 第二题 递推,排序,不超过三层的for循环。 第三题 字符串处理,递推,考查数据结构构造能力,不超过三层的for循环。 第四题 动态规划,贪心算法,图论最短路径,最小生成树等。 第五题 网络流,图论,字符串,考查数据结构构造能力,以及非常人的随机应变能力。 ...

宋旭升的博客 6万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

CCF-CSP_201812(第15次)

1.小明上学 #include <stdio.h> #include <string.h> #define MAXN 105 using namespace std; int main(){ int r, y, g, n, k, t, ans = 0; //Red[0,r) Green[r, r+g) Yello[r+g, r+g+y) scanf("%d%d%d", &r, &y, &g); scanf("%d", &

Sigmoid 188

CCF201812-3-CIDR合并

(一)题面: 样例输入 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....

xbb0720的博客 3454

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

CCF 201812-3 CIDR合并

  样例输入 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 PS:又到了ccf最烦人的第三题大模拟,往往耗费几小时还得不到满分,代码越简洁越不容易扣分。 分析: 本题较以往的大模拟更为复杂,要求我...

昂昂累世士的博客 1683

CCF201812-3 CIDR合并 (python语言)

由于题目繁琐,本篇文章只解决题目中最简单的处理情况,可以得60分 试题编号: 201812-3 试题名称: CIDR合并 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 样例输入 2 1 2 样例输出 1.0.0.0/8 2.0.0.0/8 样例输入 2 ...

SoftwareZhen的博客 2962

ccf 2018-12-3 CIDR合并

这是第一次参加ccf考试,当时考场上只得了50分,思路有点不清晰,回来整理了一下思路 其实考试题目都给了思路了 我的思路就是一个结构体,记录IP地址四段中的每一段的大小,还有一个len记录IP地址的长度 排序操作使用sort函数自动 从小到大合并使用另一个list来存储 统计合并就像进栈出栈一样 其实这两个我都想用list直接删除的好,但并不会这种操作 下面是满分代码,附带了两个...

qq_41914302的博客 1240

CCF201812-3 CIDR合并

试题编号: 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 样例输出 1...

逐梦者 7237

ccf-201812-4

原题ccf官网还没放出,不过分数倒是出来了,有惊无险的100分通过了 凭着记忆的话大致是求一个连通图的生成树,且该生成树的最大的边要最小 众所周知,求生成树用并查集最快,遇到最大的最小或者最小的最大之类的字眼需要用到二分来解决 所以这题的解决办法就是——二分并查集 具体的细节看代码吧 #include&lt;iostream&gt; using namespace std; int f...

imotolove的博客 1071

CCF CSP认证考试题解目录

CCF认证考试题解目录 编号 标题 题解 分类 备注 201809-1 卖菜 201809-2 买菜 201809-3 元素选择器 201809-4 再卖菜 201809-5 线性递推式 201803-1 跳一跳 C++ 简单模拟 201803-2 碰撞的小球 C++ 中级模拟 201803-3

日沉云起的博客 8万+

CCF 201812-3CIDR合并

题目描述 题解 ip的存储用一个结构体,int 数组存储ip,len是ip的前缀长度。 第一步:ip排序就是结构体排序,可自定义cmp或重载operator <。 第二步:从大到小合并。相邻ip,只有在前一个len1小于后一个len2且两个ip的前len1位异或等于0才表示后一个是前一个的子集。 第三步:同级归并,相邻ip只有两个前缀长度相等且前len1位异或等于1表示它俩可以合并...

Onwaier的博客 578
上一篇: 页式,段式,段页式存储的虚拟地址空间维数问题
下一篇: [CCF/CSP] 2019-(2) 二十四点 C++ 100分
AndrewJoe
博客等级 码龄11年 13粉丝 12原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值