LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题
题目链接:给你n(n<=3e4)个路由地址(注意有子网掩码现象),
路由地址:128.0.0.0/1的形式
要求你输出一个路由集合,其是给定的路由集合的补集,且个数越少越好
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define CT continue
#define SC scanf
const int N=3*1e5+10;
const int mod=1e9+7;
int L[2*N],R[2*N],dep[2*N],cnt;
bool flag[2*N];
bitset<32> bit_ip; void init()
{
cnt=0;
MM(L,-1);
MM(R,-1);
MM(flag,0);
bit_ip.reset();
} void tree_insert(ll ip,ll deep)
{
bit_ip=ip;
int cur=0;
for(int i=0;i<deep;i++){
if(bit_ip[31-i]){
if(R[cur]==-1) R[cur]=++cnt;
cur=R[cur];
}
else{
if(L[cur]==-1) L[cur]=++cnt;
cur=L[cur];
}
}
flag[cur]=1;
} struct node{
bitset<32> bit_ip;int deep;
}; vector<node> ans;
void dfs(int u,int deep)
{
if(u==-1){
ans.push_back((node){bit_ip,deep});
return;
}
if(flag[u]) return;
bit_ip[31-(deep+1)]=1;
dfs(R[u],deep+1);
bit_ip[31-(deep+1)]=0;
dfs(L[u],deep+1);
} int main()
{
int cas,n,kk=0;
SC("%d",&cas);
while(cas--){
SC("%d",&n);
if(!n) {
printf("Case #%d:\n1\n",++kk);
printf("0.0.0.0/0\n");CT;
}
init();
int p[6],deep=0;
for(int i=1;i<=n;i++){
SC("%d.%d.%d.%d/%d",&p[1],&p[2],&p[3],&p[4],&deep);
ll ip=p[1];
for(int i=2;i<=4;i++) ip=(ip<<8)+p[i];
tree_insert(ip,deep);
} bit_ip=0;
ans.clear();
dfs(0,-1); printf("Case #%d:\n%d\n",++kk,ans.size());
for(int i=0;i<ans.size();i++){
node u=ans[i];
bitset<32> u_ip=u.bit_ip;
for(int i=3;i>=0;i--){
ll tmp=0;
for(int j=7;j>=0;j--) tmp=(tmp<<1)+u_ip[i*8+j];
printf("%lld",tmp);
if(i) printf(".");
}
printf("/%d\n",u.deep+1);
}
}
return 0;
}
分析:
错因分析:不敢离散化字典树。。。。
解决:
1.既然是都是二进制,且只有32位,那么可以想到利用字典树,但是如果直接给每一位安排一个分叉的话,那么总共要2^32,显然开不了这么大的数组,但是最多只会插入1e4个路由地址,所以可以离散化一下,转变下思维,以前是i是父节点,2*i是左二子,2*i+1是右儿子,,,那么其实只要给每个节点设置一个L[]和R[]数组记录下子节点就好
2.因为牵涉到位运算,可以直接使用STL中的bitset简化运算
LA 7043 International Collegiate Routing Contest 路由表 字典树离散化+bitset 银牌题的更多相关文章
- ACM International Collegiate Programming Contest World Finals 2014
ACM International Collegiate Programming Contest World Finals 2014 A - Baggage 题目描述:有\(2n\)个字符摆在编号为\ ...
- ACM International Collegiate Programming Contest World Finals 2013
ACM International Collegiate Programming Contest World Finals 2013 A - Self-Assembly 题目描述:给出\(n\)个正方 ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syria, Lattakia, Tishreen University, April, 30, 2018
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2018) Syr ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- BZOJ4212 神牛的养成计划 (字典树,bitset)
题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...
- BNUOJ48605International Collegiate Routing Contest 题解
题目大意: 给你一些子网,求它们在整个网段的补集. 思路: 将子网转换成二进制建一棵Trie,直接DFS搜到没有了就记下来输出.注意:所给的子网会有交集,若搜到结尾就不向下搜了. 代码: #inclu ...
- Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...
- [ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018)]
https://codeforces.com/gym/101810 A. Careful Thief time limit per test 2.5 s memory limit per test 2 ...
- 2019.04.04 第二次训练 【ACM International Collegiate Programming Contest, JUST Collegiate Programming Contest (2018)】
题目链接:https://codeforces.com/gym/101853 A: ✅ B: (二分图匹配) https://blog.csdn.net/qq_41997978/article/det ...
随机推荐
- Centos7下,宿主机nginx配合docker环境的php-fpm
一.安装docker并启动 yum install docker systemctl start docker 二.安装nginxCentOS 7默认不能从yum中安装nginx,原因可以自己搜索一下 ...
- 用shell脚本安装MySQL-5.7.22-Percona版本
#!/bin/bash MySQL_Package=Percona-Server-5.7.22-22-Linux.x86_64.ssl101.tar.gz Package_Source=Percona ...
- S03_CH01_AXI_DMA_LOOP 环路测试
S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...
- Rikka with Graph hdu 6090
题解:考虑贪心地一条一条边添加进去. 当 m \leq n-1m≤n−1 时,我们需要最小化距离为 nn 的点对数,所以肯定是连出一个大小为 m+1m+1 的联通块,剩下的点都是孤立点.在这个联通块中 ...
- 使ul中的li居中
1.如果li设置了float:left; 解决办法: 1.ul父元素的标签设置:text-align: center; 2.ul设置: display: inline-block; 2.li不设置fl ...
- python 画正态曲线
import numpy as np import matplotlib.pyplot as plt import math # Python实现正态分布 # 绘制正态分布概率密度函数 u = 0 # ...
- RabbitMQ的持久化
RabbitMQ的持久化主要体现在三个方面,即交换机持久化,队列持久化及消息持久化 注意,因公司使用php-amqplib来实现RabbitMQ,故之后举例说明的代码均使用的php-amqplib ...
- QTP10破解步骤(亲试有效)
QTP10破解步骤: 1.安装qtp,一路默认下来(一定要默认安装目录),一直到要求输入License的界面 2.拷贝mgn-mqt82.exe到C:\Program Files\Mercury In ...
- Linux内核移植的若干问题
- dropbear源码编译安装及AIDE软件监控
ssh协议的另一个实现:dropbear源码编译安装:• 1.安装开发包组:yum groupinstall “Development tools”• 2.下载 -2017.75.tar.bz2 ...