按题意模拟即可。。。主要CCF吞代码。。。

#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls (x<<1)
#define rs (x<<1|1)
#define ll long long
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Forr(i,a,b) for(int i=a;i>=b;i--)
#define Fr(i,a,b) for(int i=a;i<b;i++)
#define Frr(i,a,b) for(int i=a;i>b;i--)
#define pll pair<ll,ll>
using namespace std;
const int maxn=1e6+100;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct node
{
int s[5];
friend bool operator<(node a,node b)
{
if(a.s[0]!=b.s[0])return a.s[0]<b.s[0];
if(a.s[1]!=b.s[1])return a.s[1]<b.s[1];
if(a.s[2]!=b.s[2])return a.s[2]<b.s[2];
if(a.s[3]!=b.s[3])return a.s[3]<b.s[3];
return a.s[4]>b.s[4];
}
}no[maxn];
int n,m;
string str;
int p[10],q[10];
int cnt1,cnt2;
int cal(int l,int r)
{
int ans=0;
int sr=1;
for(int i=r;i>=l;i--)
{
ans+=(str[i]-'0')*sr;
sr*=10;
}
return ans;
}
void init()
{
cin>>n;getchar();
for(int i=1;i<=n;i++)
{
cin>>str;
int len=str.length();
cnt1=cnt2=0;
for(int j=0;j<len;j++)
{
if(str[j]=='.')p[++cnt1]=j;
if(str[j]=='/')q[++cnt2]=j;
}
int las=0;
if(!cnt1)
{
if(!cnt2)
{
no[i].s[0]=cal(0,len-1);
no[i].s[4]=8;
}
else
{
no[i].s[0]=cal(0,q[1]-1);
no[i].s[4]=cal(q[1]+1,len-1);
}
}
else
{
for(int j=1;j<=cnt1;j++)
{
int pl=p[j];
no[i].s[j-1]=cal(las,pl-1);
las=pl+1;
}
if(cnt2)
{
no[i].s[cnt1]=cal(las,q[cnt2]-1);
no[i].s[4]=cal(q[cnt2]+1,len-1);
}
else
{
no[i].s[cnt1]=cal(las,len-1);
no[i].s[4]=(cnt1+1)*8;
}
}
} }
int nxt[maxn];
pair<ll,ll> cal1(node aa)
{
ll tmp=0;
ll st=1;
for(int i=3;i>=0;i--)
{
tmp+=aa.s[i]*st;
st*=256;
}
ll minn=(tmp/(1ll<<(32-aa.s[4])))*(1ll<<(32-aa.s[4]));
ll maxx=minn+(1ll<<(32-aa.s[4]))-1;
return mp(minn,maxx);
}
void solve1()
{
sort(&no[1],&no[n+1]);
for(int i=1;i<=n;i++)
{
nxt[i]=i+1;
}
for(int i=1;i<=n;i=nxt[i])
{
int tt=nxt[i];
if(tt>n)break;
while(1)
{
if(tt>n)break;
pll a1=cal1(no[i]),a2=cal1(no[tt]);
if(a1.fi>=a2.fi&&a2.se>=a1.se)
{
no[i]=no[tt];
nxt[i]=nxt[tt];
tt=nxt[tt];
}
else if(a1.fi<=a2.fi&&a2.se<=a1.se)
{
nxt[i]=nxt[tt];
tt=nxt[tt];
}
else
{
break;
}
}
}
}
int pr[maxn];
void solve2()
{
int pre=0;
for(int i=1;i<=n;i=nxt[i])
{
int tt=nxt[i];
int pre1=pre;
int j=i;
pr[i]=pre;
if(tt>n)break;
while(1)
{
tt=nxt[i];if(tt>n)break;
int flg=0;
if(no[i].s[4]==no[tt].s[4])
{
node ne=no[i];
if(no[i].s[4])
ne.s[4]=no[i].s[4]-1;
pll v1=cal1(ne);
pll v2=cal1(no[i]),v3=cal1(no[tt]);
if(v1.se-v1.fi==v3.se-v2.fi&&v2.fi==v1.fi&&v3.se==v1.se&&v2.se+1==v3.fi)
{
flg=1;
no[i]=ne;
nxt[i]=nxt[tt];
}
if(flg&&pre)
{
i=pr[i];
pre=pr[i];
}
if(!flg)
{
break;
}
}
else
{
break;
}
}
pre=i;
}
}
void print()
{
for(int i=1;i<=n;i=nxt[i])
{
for(int j=0;j<=4;j++)
{
cout<<no[i].s[j];
if(j<3)cout<<".";
if(j==3)cout<<"/";
}cout<<"\n";
}
}
int main()
{
init();
solve1();
solve2();
print();
}

  

CCF201812-3 CIDR合并的更多相关文章

  1. CCF 201812-3 CIDR合并

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

  2. CIDR合并

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

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

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

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

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

  5. CIDR

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

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

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

  7. 第5章 子网划分和CIDR

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

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

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

  9. IP地址和CIDR

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

随机推荐

  1. 常用vi编辑器命令行

    游标控制: h 游标向左移 j 游标向下移 k 游标向上移 l(or spacebar) 游标向右移 w 向前移动一个单词 b 向后移动一个单词 e 向前移动一个单词,且游标指向单词的末尾 ( 移到当 ...

  2. [Java] 为什么字符串比较不能用两个等号(==)

    Java中,使用"=="比较字符串时,判断的是两个字符串是否存放在相同的位置.如果两个字符串存放在相同的位置,那么它们就是相同的,使用"=="比较的结果也就是T ...

  3. String-StringBuffer-StringBuilder的区别和源码分析

    一,String,StringBuffer,StringBuilder三者之间的关系 三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilde ...

  4. 2D射影几何和变换

    阅读<计算机视觉中的多视图集合> 2D射影几何和变换 2D射影平面 本章的关键是理解线和点的对偶性.从射影平面模型出发,IP^2^内的点(a, b ,c)由IP^3^空间中一条过原点的射线 ...

  5. netstat -an查看到大量的TIME_WAIT状态的解决办法

    netstat下time_wait状态的tcp连接: 1.这是一种处于连接完全关闭状态前的状态: 2.通常要等上4分钟(windows server)的时间才能完全关闭: 3.这种状态下的tcp连接占 ...

  6. Java Web相关问题

     关于这两天主要问题的解答: (1) 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接.错误: java.lang.RuntimeException: Could no ...

  7. CRC32明文攻击

    明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)时, 因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密 ...

  8. windowsserver 2019系统安装教程

    windowsserver2019和windowsserver2016一样也分两个版本标准版和数据中心版. 1.插入系统光盘 2.选择安装版本一般选择带桌面体验的,要不安装成功后没有桌面. 3.设置分 ...

  9. windows server 2012 R2 部署AD域服务

    一.部署AD域控制器 首先,我们检查第一台已经安装Windows Server 2012 R2的服务网络的相关配置,确定的服务器IP地址.子网掩码.默认网关的参数如下,由于该服务器既要充当ADDC角色 ...

  10. 特殊需求:EF 6.x如何比较TimeSpan格式的字符串?EF Core实现方式是否和EF 6.x等同?

    前言 我们知道C#中的TimeSpan对应SQL Server数据库中的Time类型,但是如果因为特殊需求数据库存储的不是Time类型,而是作为字符串,那么我们如何在查询数据时对数据库所存储的字符串类 ...