CCF-CIDR合并-201812-3
看着很长的一道题目,其实还可以...但我只有90分...可能有些细节没有注意到...难受!
思路:
数据结构:
string str ; 存储32位01串
int len: 前缀长度
首先将输入的ip标准化,使用了split()函数,和find(),substr()的string_STL
自定义排序
大小合并 : 从前往后
同级合并: 从后往前
#include <bits/stdc++.h>
using namespace std;
typedef vector <string> vs;
const int N=1e6+;
string zero="";
struct node {
string str;
int len;
bool operator<(const node& x) const {
if (str==x.str) return len<x.len;
return str<x.str;
}
};
node t[N],tmp[N]; int n;
vs split(string str,const char flag='.') {
istringstream iss(str);
vs ans;
while (getline(iss,str,flag))
if (str.size())
ans.push_back(str);
return ans;
}
int to_int (string str,int base) {
int ans=;
for (int i=;i<str.size();i++)
ans=ans*base+str[i]-'';
return ans;
}
void get_str (string &str, vs sv) {
for (int i=;i<sv.size();i++) {
int num=to_int(sv[i],);
for (int j=;j<=;j++) {
str[(i+)*-j]=''+num%;
num=num/;
}
}
//cout<<str<<endl;
}
void input_node (node &x ) {
x.str=zero;
string str; cin>>str;
int pos=str.find("/");
if (pos==-) {
vs sv=split(str);
x.len=*sv.size();
get_str(x.str,sv);
}
else {
string s1=str.substr(,pos),s2=str.substr(pos+);
x.len=to_int(s2,);
vs sv=split(s1);
get_str(x.str,sv);
}
}
void output_node (node x) {
for (int i=;i<;i++) {
cout<<to_int(x.str.substr(i*,),);
if (i!=) cout<<".";
else cout<<"/";
}
cout<<x.len<<"\n";
}
bool isok (node t1,node t2) {
if (t1.len<t2.len) return ;
for (int i=;i<t2.len;i++)
if (t1.str[i]!=t2.str[i])
return ;
return ;
}
void merg1() {
int cnt=;
for (int i=;i<=n;i++)
if (!isok(t[i],t[cnt]))
t[++cnt]=t[i];
n=cnt;
}
bool isok2 (node t1,node t2) {
if (t1.len!=t2.len) return ;
for (int i=;i<t1.len-;i++)
if (t1.str[i]!=t2.str[i])
return ;
return ;
}
void merg2() {
int cnt=;
for (int i=n;i>= ;i--) {
if (i>=&&isok2(t[i],t[i-])) t[i-].len--;
else tmp[++cnt]=t[i];
}
for (int i=;i<=cnt;i++)
t[i]=tmp[cnt-i+];
n=cnt;
}
int main ()
{
ios::sync_with_stdio(false);
zero+=zero; zero+=zero;
cin>>n;
for (int i=;i<=n;i++) input_node(t[i]);
sort (t+,t++n);
merg1();
merg2();
for (int i=;i<=n;i++)
output_node(t[i]);
return ;
}
CCF-CIDR合并-201812-3的更多相关文章
- CCF 201812-3 CIDR合并
CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...
- 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. ...
随机推荐
- A context-aware personalized travel recommendation system based on geotagged social media data mining
文章简介:利用社交网站Flickr上照片的geotag信息将这些照片聚类发现城市里的旅游景点,通过各照片的拍照时间得到用户访问某景点时的时间上下文和天气上下文(利用时间和public API of W ...
- SharePoint附加内容数据库时报错
今天遇到一个很奇怪的问题,在sharepoint管理中心中给web application添加内容数据库时报错:The SharePoint database named WSS Content al ...
- c# 关于Threading.ApartmentState
今天在做一个需求 就是 客户端的注销重新登录的操作,想必大家很清楚这个逻辑应该怎么去做, 在主线程里面去调用这个注销的方法 然后关闭当前应用域,重新开一个线程 让应用域在上面执行. STA(singl ...
- C# [GDI+] [API] Get Image bytes Length
MemoryBMP "{b96b3caa-0728-11d3-9d7b-0000f81ef32e}" 2 Bmp "{b96b3cab-0728-11d3-9d7b-00 ...
- .net core webapi 使用ValidationAttribute对比同一对象的多个参数
众所周知,在使用DataAnnotations数据验证的时候,特别是针对同一个InputDto的多个属性进行对比的时候,例如起始日期不能大于结束日期,我们需要在Attribute中知道当前InputD ...
- react-redux-数据流
redux是严格的单向数据流 1,store.dispatch(action) 2, reducer(previousState, action), reducer是纯函数.它仅仅用于计算下一个 st ...
- shell脚本的多线程
shell脚本的多线程 #!/bin/bash ###这是个多线程脚本!!!! ..} do { .$i >/dev/null ];then echo "192.168.2.$i 存活 ...
- Android:JNI强化训练
一.前言 Java本机接口(Java Native Interface (JNI))是本机编程接口,它是JDK的一部分,JNI它提供了若干的API,实现了和Java和其他通信(主要是C&C++ ...
- Linux 设备驱动之字符设备
参考转载博客:http://blog.chinaunix.net/uid-26833883-id-4369060.html https://www.cnblogs.com/xiaojiang1025/ ...
- ubuntu系统 不能访问非系统磁盘即挂载的数据盘 Unable to access "DATA"
问题描述: ubuntu14.04 有两个硬盘,一个固态硬盘作为系统盘,一个机械硬盘作为数据盘. 打开 数据盘“DATA”时出现下面的错误: Unable to access "DATA&q ...