题目链接:给你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 银牌题的更多相关文章

  1. ACM International Collegiate Programming Contest World Finals 2014

    ACM International Collegiate Programming Contest World Finals 2014 A - Baggage 题目描述:有\(2n\)个字符摆在编号为\ ...

  2. ACM International Collegiate Programming Contest World Finals 2013

    ACM International Collegiate Programming Contest World Finals 2013 A - Self-Assembly 题目描述:给出\(n\)个正方 ...

  3. 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 ...

  4. 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. ...

  5. BZOJ4212 神牛的养成计划 (字典树,bitset)

    题面 Description Hzwer成功培育出神牛细胞,可最终培育出的生物体却让他大失所望- 后来,他从某同校女神 牛处知道,原来他培育的细胞发生了基因突变,原先决定神牛特征的基因序列都被破坏了, ...

  6. BNUOJ48605International Collegiate Routing Contest 题解

    题目大意: 给你一些子网,求它们在整个网段的补集. 思路: 将子网转换成二进制建一棵Trie,直接DFS搜到没有了就记下来输出.注意:所给的子网会有交集,若搜到结尾就不向下搜了. 代码: #inclu ...

  7. Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology

    今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...

  8. [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 ...

  9. 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 ...

随机推荐

  1. PHP搭建B2C分销商城系统需要考虑哪些因素?(一)

    在网购日渐繁盛的今天,传统线下门店和代理分销越发显示出其弊端.此种情况下,进入互联网市场是最好的选择.入驻第三方平台成本太高,无法掌握自己的流量,所以搭建自己的分销平台成为众多企业的首选.搭建B2C分 ...

  2. ASP.NET跨平台、分布式技术架构技术栈概览 (迄今为止最全的.NET技术栈)

    今天有个学技术的小兄弟问我,现在这么多的技术我要学哪个?我说你根据岗位来学,学好了哪一门都可以在社会上立足,如今已经早已不是我们当年学习IT时候那么单纯了,给他讲了很多,发现现在的技术栈变得层次复杂且 ...

  3. RPA自定义脚本打开文件夹

    import os import subprocess from rpa.web.common.utils import convert_2_unicode def startfile(filenam ...

  4. APP安全测试之安装/卸载/更新测试

    在app测试中,有个不可忽视的测试方向,就是安装.卸载和更新,有很多人问到了这个问题,我就在这里做了一个总结,有补充的请留言哦 安装 1.正常安装测试,检查是否安装成功. 2.APP版本覆盖测试.例如 ...

  5. python 定时爬取内容并发送报告到指定邮箱

    import requests import smtplib import schedule import time from bs4 import BeautifulSoup from email. ...

  6. python入门pk小游戏

    import time import random flag = True while flag: player_win = 0 enemy_win = 0 for i in range(1, 4): ...

  7. C# 将一种类型的数组转化为另一种类型的数组

    //字符串数组(源数组) "}; //整型数组(目标数组) int[] iNums; //转换方法 iNums = Array.ConvertAll<string, int>(s ...

  8. 用Activator.CreateInstance代替new实现类的实例化

    一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例. 这在工厂模式中是非常有用的 这样,可以使程序有更高的扩展性,例如,,下面的例子 如果现在有一个类,专门用来计算交通工具的速度, ...

  9. sqlserver查询数据的所有表名和行数及空间占用量

    //查询所有表名 select name from sysobjects where xtype='u' --modify_date指表结构最后更新日期,并非数据最后更新日期SELECT     na ...

  10. C# enum枚举知识总结

    C#中除了简单的变量类型外,还提供了三种较为复杂的变量类型,包括枚举.结构和数组.本文主要讲述枚举相关的知识. 枚举类型(也称为枚举),提供了一种有效的方式,来定义可能分配给变量的一组已命名的整数常量 ...