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. ...
随机推荐
- 如何不使用loop循环创建连续的数组
ES5 Array.apply(null,{length:100}) Object.keys(Array.apply(null,{length:100})); ES6 [...Array(100)]
- Qt 分页标题打印
void ItemSplitter::printpdf(const QString& fileName){ QPrinter printer_html(QPrinter::ScreenReso ...
- 微信浏览器无法下载APK文件的解决方案
大家是不是经常会遇到微信内点击链接或扫描二维码无法打开指定网页的问题?只要你使用微信转发分享,相信你就一定会遇到,那么打不开的原因很简单了,就是被微信拦截了.这个问题我们只需要实现从微信内直接跳出到外 ...
- Nuget连接失败的问题
---恢复内容开始--- .net 项目开发管理中我们经常使用Nuget管理我们的类库.由于某些原因 nuget v3的镜像源https://api.nuget.org/v3/index.json 经 ...
- Linux下的C----多进程与多线程
1.多进程实例: 进程: 是一种抽象的概念,从来没有统一的标准定义: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动:进程是一个独立的可调度的活动:进程是可以并行执行的计算单位:进程是 ...
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- 实训任务02:Hadoop基础操作
实训任务02:Hadoop基础操作 班级 学号 姓名 实训1:创建测试文件上传HDFS,并显示内容 需求说明: 在本地计算机上创建测试文件helloH ...
- Hello vue.js的随笔记录
数据双向绑定的script在组件定义位置后面才顶用. 使用它的话,引用js就好,比较简单. 声明一个vm对象,new Vue({}).这个构造里传一个对象,包含el:界面元素,data:数据,meth ...
- POST 调用 301 Moved Permanently 问题
如上测试了2种,第一个post访问接口https能正常返回,第二个post访问接口http时301 Moved Permanently出现永久重定向问题,经检查发现服务器nginx对80端口做了重定向 ...
- Linux:Red Hat系统的安装
今天高兴,所以我写这一期,这一期写的是Red Hat系统的安装,这个开发系统也是红帽企业制作出来的,关于这款系统的相关资料就自行百度吧!话不多说,直接进入这期的内容吧! 安装Red Hat系统 系统下 ...