【BZOJ4523】[Cqoi2016]路由表 Trie树模拟
【BZOJ4523】[Cqoi2016]路由表
Description
路由表查找是路由器在转发IP报文时的重要环节。通常路由表中的表项由目的地址、掩码、下一跳(Next Hop)地址和其他辅助信息组成。例如:
.png)
.png)
Input
Output
包含若干行,每行仅有一个整数,依次对应每个查询操作。
题解:奇怪了,我怎么连这种模拟题都做了~
我们先离线,对询问串构建Trie树,然后依次将表项放到Trie树中查询。如何求一个询问串被更改的次数呢?由于每次更改,匹配的长度一定会变长,所以我们可以对Trie树的每个节点都开一个vector,在询问串经过的Trie树上的每个节点的vector中都加入这个询问。在查询时,我们将对应节点的vector中的询问都拿出来,依次判断是否产生更新,然后将这个vector清空。
结果第一发MLE了,后来知道数组开3500000就行。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef unsigned int ui;
const int maxn=1000010;
int n,m,Q,tot;
int vis[maxn],first[maxn],last[maxn],mx[maxn],ans[maxn],len[maxn];
ui val[maxn],v[maxn];
char str[10];
struct node
{
int ch[2];
vector<int> v;
}p[maxn*5];
vector<int> q[maxn];
vector<int>::iterator it;
inline void insert(int x)
{
register int i,u;
register bool d;
for(i=31,u=1;i>=0;i--)
{
d=(val[x]>>i)&1;
if(!p[u].ch[d]) p[u].ch[d]=++tot;
u=p[u].ch[d],p[u].v.push_back(x);
}
}
inline void query(int x)
{
register int i,u;
register bool d;
for(i=31,u=1;i>=31-len[x]+1;i--)
{
d=(v[x]>>i)&1;
if(!p[u].ch[d]) return ;
u=p[u].ch[d];
}
for(it=p[u].v.begin();it!=p[u].v.end();it++)
{
i=*it;
if(x>=first[i]&&x<=last[i]&&mx[i]<len[x]&&vis[i]<x) vis[i]=x,ans[i]++;
mx[i]=max(mx[i],len[x]);
}
p[u].v.clear();
}
inline int rd()
{
register int ret=0,f=1; register char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
//freopen("bz4523.in","r",stdin);
//freopen("bz4523.out","w",stdout);
m=rd(),tot=1;
register int i;
register ui a,b,c,d;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]=='Q') a=rd(),b=rd(),c=rd(),d=rd(),val[++Q]=a<<24|b<<16|c<<8|d,insert(Q),first[Q]=rd(),last[Q]=rd();
else a=rd(),b=rd(),c=rd(),d=rd(),v[++n]=a<<24|b<<16|c<<8|d,len[n]=rd();
}
tot=1;
for(i=1;i<=n;i++) query(i);
for(i=1;i<=Q;i++) printf("%d\n",ans[i]);
return 0;
}
【BZOJ4523】[Cqoi2016]路由表 Trie树模拟的更多相关文章
- 【BZOJ-4523】路由表 Trie树 + 乱搞
4523: [Cqoi2016]路由表 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 155 Solved: 98[Submit][Status][ ...
- BZOJ 4523 [Cqoi2016]路由表 Trie树
Trie树的应用题目. 在线建立一棵01 Trie树,然后按照要求用询问在上面跑,用单调栈维护答案即可. #include<iostream> #include<cstdio> ...
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
Revenge of Fibonacci 题意:给定fibonacci数列的前100000项的前n位(n<=40);问你这是fibonacci数列第几项的前缀?如若不在前100000项范围内,输 ...
- 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找
千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...
- 【BZOJ2741】【FOTILE模拟赛】L 分块+可持久化Trie树
[BZOJ2741][FOTILE模拟赛]L Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max( ...
- hdu4886 TIANKENG’s restaurant(Ⅱ) (trie树或者模拟进制)
TIANKENG’s restaurant(Ⅱ) Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 130107/65536 K (Ja ...
- 【CF888G】Xor-MST Trie树(模拟最小生成树)
[CF888G]Xor-MST 题意:给你一张n个点的完全图,每个点有一个权值ai,i到j的边权使ai^aj,求这张图的最小生成树. n<=200000,ai<2^30 题解:学到了求最小 ...
- 2018.10.20 NOIP模拟 巧克力(trie树+dfs序+树状数组)
传送门 好题啊. 考虑前面的32分,直接维护后缀trietrietrie树就行了. 如果#号不在字符串首? 只需要维护第一个#前面的字符串和最后一个#后面的字符串. 分开用两棵trie树并且维护第一棵 ...
- 【bzoj2741】[FOTILE模拟赛]L 可持久化Trie树+分块
题目描述 FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor A ...
随机推荐
- iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
一.新特性界面搭建的思路: 在AppDelegate加载主窗体的时候进行判断程序版本号,直接进入程序或者进入新特性展示界面 取出当前的版本号,与旧的版本号相比较(旧的版本号在进入程序的时候存起来 =& ...
- 清除DataGridView显示的数据
一.DataGridView未绑定数据时清空数据 this.dgv_PropDemo.DataSource = null 二.DataGridView绑定数据时清空数据 DataGridView绑定了 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛
/* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...
- 标准的 C++ 由三个重要部分组成
标准的 C++ 由三个重要部分组成: 核心语言,提供了所有构件块,包括变量.数据类型和常量,等等.C++ 标准库,提供了大量的函数,用于操作文件.字符串等.标准模板库(STL),提供了大量的方法,用于 ...
- (转)S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)
作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...
- (转)I,P,B帧和PTS,DTS的关系
基本概念: I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象. ...
- 好的API设计
[非原创,原文链接] API设计书籍下载: 1.keynote.pdf 2.api-design.pdf 最近在重构公司的一个交互中间件,在重新设计API及总体架构的时候思考了许多, 不禁萌发了一个疑 ...
- R语言低级绘图函数-rect
rect 函数用来在一张图上添加矩形,只需要指定左下角和右上角的坐标的位置,就可以画出一个矩形 基本用法: plot(1:5, 1:5, xlim = c(0,6), ylim = c (0,6), ...
- 【Java面试题】39 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
1.什么是Set?(what) Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象. 2.如何来区分重复与否呢?(how) “ 用 iterator() ...
- javascript 高级选择器:querySelector 和 querySelectorAll
querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流 ...