看着很长的一道题目,其实还可以...但我只有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的更多相关文章

  1. CCF 201812-3 CIDR合并

    CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...

  2. CCF201812-3 CIDR合并

    按题意模拟即可...主要CCF吞代码... #include<bits/stdc++.h> #define pb push_back #define mp make_pair #defin ...

  3. CIDR合并

    code #include <iostream> #include <list> #include <sstream> #include <vector> ...

  4. CCF-CSP题解 201812-3 CIDR合并

    题目想求与给定前缀列表等价的包含IP前缀数目最少的前缀列表. 首先是怎么存储前缀列表.用一个long long存储IP地址,再存一个前缀长度,封装在一个结构体里\(<ipNum, len> ...

  5. CCF-CSP认证 C++题解目录

    持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...

  6. CIDR

    CIDR的介绍: CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类.B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空 ...

  7. 无分类编址(CIDR)构成超网

    CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...

  8. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...

  9. 无分类编址(CIDR,Class Inter-Domain-Routing)

    CIDR全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,大家多称之为无分类编址 CIDR的特点 (1)CIDR消除了传统的A类.B类和C类地址以及划分 ...

  10. IP地址和CIDR

    IP地址(IPV4) IPV4的地址是一个32位的二进制数,由网络ID和主机ID两部分组成,用来在网络中唯一的标识一台计算机.IP地址通常用四组3位的十进制数表示,中间用.分割,例如:192.168. ...

随机推荐

  1. 算法和数据结构~各位排序算法的介绍与实现(C#)

    排序是指将元素集合按照规定的顺序排列.通常有两种排序方法,升序排列和降序排列.例如,对整数集{5,2,7,1}进行升序排列,结果为{1,2,5,7},对其进行降序排列结果为{7,5,2,1}.总的来说 ...

  2. 将MD5值压缩成8位32进制生成8位长度的唯一英文数字组合字符串

    function str16to32($a){ for($a = md5( $a, true ), $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV', $d = '', ...

  3. UnityShader实现物体被遮挡描边

    之前在网上看到物体遮挡描边的功能,自己也拿来实现了一番.算作第一篇博客的开篇. 先贴出几张效果图,也是个人思路和方案的改进路线吧. ////////////////////////////////// ...

  4. java 读取文件乱码

    private void filereader() throws IOException{  BufferedReader bf= new BufferedReader(new InputStream ...

  5. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...

  6. Problem 5: Smallest multiple

    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...

  7. 循环输出ViewBag集合

    <tr>            <td>                权限分配:            </td>            <td>   ...

  8. JS的作用域链与原型链

    来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加 ...

  9. 运行Office 2007安装程序提示:"找不到Office.zh-cn\OfficeMUI.xml"(转载)亲测

    去网上查结果原来是Office 2007和Visual Studio 2008 Authoring Component组件相冲突,网上说用VS.Net 2008光盘WCU\WebDesignerCor ...

  10. Python基础(切片,list循环,元组)

    list和字符串循环: 切片:list取值的一种方式,同样适用于字符串(因为字符串也有下标) 不可变类型:元组,字符串