CCF201812-3 CIDR合并
按题意模拟即可。。。主要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合并的更多相关文章
- CCF 201812-3 CIDR合并
CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...
- 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. ...
随机推荐
- 常用vi编辑器命令行
游标控制: h 游标向左移 j 游标向下移 k 游标向上移 l(or spacebar) 游标向右移 w 向前移动一个单词 b 向后移动一个单词 e 向前移动一个单词,且游标指向单词的末尾 ( 移到当 ...
- [Java] 为什么字符串比较不能用两个等号(==)
Java中,使用"=="比较字符串时,判断的是两个字符串是否存放在相同的位置.如果两个字符串存放在相同的位置,那么它们就是相同的,使用"=="比较的结果也就是T ...
- String-StringBuffer-StringBuilder的区别和源码分析
一,String,StringBuffer,StringBuilder三者之间的关系 三个类的关系:StringBuffer和StringBuilder都继承自AbstractStringBuilde ...
- 2D射影几何和变换
阅读<计算机视觉中的多视图集合> 2D射影几何和变换 2D射影平面 本章的关键是理解线和点的对偶性.从射影平面模型出发,IP^2^内的点(a, b ,c)由IP^3^空间中一条过原点的射线 ...
- netstat -an查看到大量的TIME_WAIT状态的解决办法
netstat下time_wait状态的tcp连接: 1.这是一种处于连接完全关闭状态前的状态: 2.通常要等上4分钟(windows server)的时间才能完全关闭: 3.这种状态下的tcp连接占 ...
- Java Web相关问题
关于这两天主要问题的解答: (1) 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接.错误: java.lang.RuntimeException: Could no ...
- CRC32明文攻击
明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)时, 因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密 ...
- windowsserver 2019系统安装教程
windowsserver2019和windowsserver2016一样也分两个版本标准版和数据中心版. 1.插入系统光盘 2.选择安装版本一般选择带桌面体验的,要不安装成功后没有桌面. 3.设置分 ...
- windows server 2012 R2 部署AD域服务
一.部署AD域控制器 首先,我们检查第一台已经安装Windows Server 2012 R2的服务网络的相关配置,确定的服务器IP地址.子网掩码.默认网关的参数如下,由于该服务器既要充当ADDC角色 ...
- 特殊需求:EF 6.x如何比较TimeSpan格式的字符串?EF Core实现方式是否和EF 6.x等同?
前言 我们知道C#中的TimeSpan对应SQL Server数据库中的Time类型,但是如果因为特殊需求数据库存储的不是Time类型,而是作为字符串,那么我们如何在查询数据时对数据库所存储的字符串类 ...