【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 ...
随机推荐
- HTML坦克大战学习01
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- 试读《基于MVC的JavaScript Web富应用开发》— 不一样的JavaScript
前言 <基于MVC的JavaScript Web富应用开发>是ItEye在7月份发起试读的书.下载了试读的章节,发现只有全本的开始到第二章,第一章很简洁明了地讲述了JavaScript的历 ...
- C语言 字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...
- C语言 常用的宏定义
__FILE__ :宏在预编译时会替换成当前的源文件名 __LINE__:宏在预编译时会替换成当前的行号 __FUNCTION__:宏在预编译时会替换成当前的函数名称 //宏__VA_ARGS__的用 ...
- B树、Trie树详解
查找(二) 散列表 散列表是普通数组概念的推广.由于对普通数组可以直接寻址,使得能在O(1)时间内访问数组中的任意位置.在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 使 ...
- Collections 集合工具类
集合工具类 包括很多静态方法来操作集合list 而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序.搜索以及线程安全等各种操作. 1) 排序( ...
- ActiveMQ-5.13.0集群
ActiveMQ集群介绍 ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave(ActiveMQ5.8版本已不可用 ...
- SharePoint 2010 讨论板列表内容的读取细节处理
list.Folder表示subject,属于特殊列表,使用list.Folder遍历项,而不是使用list.Items;list.Items表示reply;list.Items[0]["P ...
- 加L“”
error C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型 初学.net,编写如下代码运行,竟然提示错误(error C2665: “AfxMessageBo ...
- Swing中如何比较好的判断鼠标左键双击
import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im ...