CCF 201812-3 CIDR合并
CCF 201812-3 CIDR合并

//100分 93ms
#include<stdio.h>//CCF上stdio.h比cstdio快!!!
#include<string.h>
#include<algorithm>
typedef unsigned int UI;
const int N=1e5+;
struct IP{UI val,a[];}ip[N];//a[0]~a[3]表示IP地址,a[4]表示题目中的len
//val表示IP地址的十进制形式(主要作用:IP前缀能表示的数值范围)
char str[];int n;
void dealStr(int id){//字符串点分数字,转换成标准型
scanf("%s",str);
int cnt(),pn(),xn(),len=strlen(str);//pn点的数量,sn斜杠的数量
for(int i=;i<len;i++){
if(str[i]=='.') pn++;else
if(str[i]=='/') xn++;
}
for(int i=;i<;i++) ip[id].a[i]=;
char *p1=str,*p2,tmp[];
for(int i=;i<pn;i++){
p2=strchr(p1,'.');
strncpy(tmp,p1,p2-p1);//strncpy复制从p1中p2-p1长度的字符串到tmp中
tmp[p2-p1]=;
ip[id].a[cnt++]=atoi(tmp);
p1=p2+;
}
if(xn){
p2=strchr(p1,'/');//strchr从p1中查找‘/’第一次出现的位置
strncpy(tmp,p1,p2-p1);
tmp[p2-p1]=;
ip[id].a[cnt++]=atoi(tmp);//atoi 字符串转数字
p1=p2+;
strcpy(tmp,p1);
ip[id].a[]=atoi(tmp);
}
else{
strcpy(tmp,p1);
ip[id].a[cnt++]=atoi(tmp);
ip[id].a[]=cnt*;
}
ip[id].val=;//计算ip十进制值
for(int i=;i<;i++) ip[id].val+=ip[id].a[i]<<*(-i);
}
inline bool cmp(const IP &ip1, const IP &ip2){
for(int i=;i<;i++) if(ip1.a[i]!=ip2.a[i]) return ip1.a[i]<ip2.a[i];
return ;
}
inline void range(IP &ip0,UI &l,UI &r){//计算IP前缀能表示的数值范围
UI len=-ip0.a[];
l=ip0.val>>len<<len;
r=ip0.val|((<<len)-);
}
void union1(){//从小到大合并
int p=;
UI la,lb,ra,rb;
for(int i=;i<n;i++){
range(ip[p],la,ra);
range(ip[i],lb,rb);
if(la>lb||rb>ra) ip[++p]=ip[i];
}
n=p+;
}
inline bool judgeUnion(IP &ip1,IP &ip2,IP &res){//判断同级能否合并
if(ip1.a[]!=ip2.a[]||ip1.a[]<) return ;
res=ip1;res.a[]--;
UI la,lb,lc,ra,rb,rc;
range(ip1,la,ra);
range(ip2,lb,rb);
range(res,lc,rc);
if(la==lc&&rb==rc&&lb<=ra+) return ;
return ;
}
void union2(){
int p=;IP res;
for(int i=;i<n;i++){
if(judgeUnion(ip[p],ip[i],res)){
ip[p]=res;
while(p>&&judgeUnion(ip[p-],ip[p],res)) ip[--p]=res;
}
else{
ip[++p]=ip[i];
}
}
n=p+;
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++) dealStr(i);
std::sort(ip,ip+n,cmp);
union1();
union2();
for(int i=;i<n;i++) printf("%u.%u.%u.%u/%u\n",ip[i].a[],ip[i].a[],ip[i].a[],ip[i].a[],ip[i].a[]);
return ;
}
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ;
struct node {
int ip[] , len , ip4[];
unsigned int d;
node(string s) {
bool flag = ;
int cnt = ;
d = len = ;
memset(ip,,sizeof(ip));
for(int i = ; i < s.length() ; i++) {
if(s[i] == '.')continue;
else if(s[i] == '/') {
flag = ;continue;
}
else {
int t = ;
while(isdigit(s[i])) {
t = t * + s[i] - '';
i++;
}
i--;
if(!flag)ip[cnt++] = t;
else len = t;
}
}
if(!len)len = cnt * ;
cnt = ;
for(int i = ; i < ; i++) {
d = d * + ip[i];
int t = ip[i];
for(int j = cnt ; j >= cnt - ; j--) {
ip4[j] = t % ;
t /= ;
}
cnt += ;
}
}
node(){}
bool operator < (const node b) const {
return d < b.d || (d == b.d && len < b.len);
}
};
node a[maxn];
list<node> ans;
bool vis[maxn];
bool judge(node b , node c) {
if(c.len < b.len)return false;
for(int i = ; i < b.len ; i++) {
if(b.ip4[i] != c.ip4[i]) {
return false;
}
}
return true;
}
bool judge1(node b , node c) {
if(c.len != b.len || c.len == )return false;
for(int i = ; i < b.len - ; i++) {
if(b.ip4[i] != c.ip4[i])return false;
}
int len = b.len - ;
if(b.ip4[len] != c.ip4[len]) return true;
else return false;
}
int main() {
int n;
ios::sync_with_stdio();
cin.tie();cout.tie();
cin >> n;
for(int i = ; i < n ; i++) {
string s;
cin >> s;
a[i] = node(s);
}
sort(a , a + n);
for(int i = ; i < n ; ) {
int p = i;
i++;
while(i < n && !vis[i]) {
if(judge(a[p] , a[i])) {
vis[i] = ;
i++;
}
else break;
}
}
for(int i = ; i < n ; i++) {
if(!vis[i])ans.push_back(a[i]);
}
for(auto t = ans.begin() ; t != ans.end() ; t++) {
auto t1 = t;
t1++;
while(t1 != ans.end() ) {
if(judge1(*t , *t1)) {
t -> len = t -> len - ;
ans.erase(t1);
if(t != ans.begin())t--;
t1 = t; t1++;
}
else break;
}
}
for(auto t = ans.begin() ; t != ans.end() ; t++) {
cout << t -> ip[] << "."<< t -> ip[] << "." << t -> ip[] << "." << t -> ip[] << "/" << t -> len<< "\n";
}
return ;
}
网上list版代码
CCF 201812-3 CIDR合并的更多相关文章
- CCF201812-3 CIDR合并
按题意模拟即可...主要CCF吞代码... #include<bits/stdc++.h> #define pb push_back #define mp make_pair #defin ...
- CIDR合并
code #include <iostream> #include <list> #include <sstream> #include <vector> ...
- CCF-CSP题解 201812-3 CIDR合并
题目想求与给定前缀列表等价的包含IP前缀数目最少的前缀列表. 首先是怎么存储前缀列表.用一个long long存储IP地址,再存一个前缀长度,封装在一个结构体里\(<ipNum, len> ...
- 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. ...
随机推荐
- OpenGL学习 (一) - 简单窗口绘制
一.OpenGL 简介 OpenGL 本质: OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形.图像的函数.但深究下来,它是由Khronos ...
- kafka broker Leader -1引起spark Streaming不能消费的故障解决方法
一.问题描述:Kafka生产集群中有一台机器cdh-003由于物理故障原因挂掉了,并且系统起不来了,使得线上的spark Streaming实时任务不能正常消费,重启实时任务都不行.查看kafka t ...
- HashMap源码原理
HashMap源码解析(负载因子,树化策略,内部hash实现,resize策略) 内部属性: 负载因子: final float loadFactor(默认为0.75f) 实际容量: int thre ...
- 第一阶段:Java基础 1.JAVA开发介绍---5. Java的注释,标识符、标识符的命名规范
1.java注释 java中有三种注释方式,单行注释,多行注释,文档注释. (1).单行注释:快捷键Ctrl+/再次按撤销注释, (2).多行注释:Ctrl+shift+/ 撤销Ctrl+shift+ ...
- 28、IE报vuex requires a Promise polyfill in this browser问题解决
解决方法第一步: 安装 babel-polyfill . babel-polyfill可以模拟ES6使用的环境,可以使用ES6的所有新方法 npm install --save babel-polyf ...
- 8 smali文件格式
Apktool反编译apk后程序中每一个类都会有一个smali文件. 一.当前类信息:smali文件的头三行描述了当前类的一些信息. Eg: .class <访问权限> [修饰关键字]&l ...
- 在现有的mysql主从基础上,搭建mycat实现数据的读写分离
环境准备:MySQL服务器做好主从复制:centos6的系统 主:192.168.164.131 从:192.168.164.144 mycat服务器:192.168.164.141 a.将MySQL ...
- Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制
Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Options 1>.OPTIONS指 ...
- 利用form.submit提交表单导出文件到客户端浏览器, 提示下载!
本来是想利用ajax提交json数据到服务端, 让服务端生成一个excel文件并提示客户端浏览器下载的. 但是搞了很久发现ajax方式是无法触发浏览器弹出文件下载的. 网上很多的方案都是说利用form ...
- python基础笔记-字符串
字符串是 Python 中最常用的数据类型.我们可以使用引号(‘或”)来创建字符串. def main(): str1 = 'hello,world' print(len(str1))#计算字符串的长 ...