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. ...
随机推荐
- Java 自增原理
很多人都知道 i++ 和 ++i 的区别 a = i++: a = i; i = i+1; a = ++ i; i = i + 1; a = i; 但碰到 i = i ++;的时候很多人就懵了? i是 ...
- Document.write和 InnerHTML
Document.write 定义: Document.write()这种方法是将文本字符串写入document.open()打开的文档流. document.write()方法可以用在两个方面:页面 ...
- js操作对象
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- vue中几种常见技巧
1.校验延迟:点击进入页面不希望校验必填字段this.$nextTick(() => { this.$refs.formRules.clearValidate() })2.$on $emit $ ...
- canvas背景动画
偶然反驳可看到博客背景的炫酷效果 觉得很新奇就去查看了一下源码 结果在git上找到了 记录一下 https://github.com/hustcc/canvas-nest.js/
- idea 工具中项目文件上有灰色的小X号去除方法
初使用idea,在项目中发现类上有这样的灰色X号,启动项目后idea会报找不到这个类的错误,原因是它没有被编译, 解决方法 setting->Build->Compiler->Exc ...
- centos7 eclispe 编译C++遇到的问题总结
最近由于工作的需要,又开始回归之前已经遗忘了的技术.arm嵌入式这个古老的名词. 开始选择了linuxminit,开始的linuxminit17以前还可以,可是用了一下linuxminit19,发现r ...
- hibernate 保存的flush怎么用?
hibernate 中的flush方法只有在上面的数据保存用了hibernate的方法保存了,但是在同一个事物当中需要用SQL的方法去查上面保存的数据,这个时候上方的hibernate保存后面就需要用 ...
- 快速比较 Kafka 与 Message Queue 的区别
https://hackernoon.com/a-super-quick-comparison-between-kafka-and-message-queues-e69742d855a8 A supe ...
- 关于Unity3D使用时Scene视图清楚,Game视图不清楚的问题
1.自己不知道什么时候,将LowResolutioinAspectRatios给勾上了, 2.同样的Scale值大于1的时候也会造成模糊,但这个好像比1好发现一点