【BZOJ4523】[Cqoi2016]路由表 Trie树模拟
【BZOJ4523】[Cqoi2016]路由表
Description
路由表查找是路由器在转发IP报文时的重要环节。通常路由表中的表项由目的地址、掩码、下一跳(Next Hop)地址和其他辅助信息组成。例如:
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 ...
随机推荐
- OC基础--常用类的初步介绍与简单使用之NSDate
一.创建一个时间 NSDate *date = [NSDate date]; // 打印出的时间是0时区的时间(北京--东八区) NSLog(@"%@",date); 二.日期格式 ...
- 谈API网关的背景、架构以及落地方案
Chris Richardson曾经在他的博客上详细介绍过API网关,包括API网关的背景.解决方案以及案例.对于大多数基于微服务的应用程序而言,API网关都应该是系统的入口,它会负责服务请求路由.组 ...
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
1.pack后为包名,包与系统文件夹一一对应.并且代码中的包名不包含文件包的名字,即文件名 2.javac 按照*.java 文件的所在路径进行编译,编译完成后,使用java +完整包名(包含文件包名 ...
- 关于树莓派 BOOBS 安装之后的初级操作
以安装OpenCV 3.1.0为例 上一篇我们利用Raspberry 官方提供的工具 BOOBS安装了Raspbian 操作系统,下面让我们看一下如何简单的配置raspbian操作系统. 从树莓派官方 ...
- 【转】Hibernate系列学习之(二) 多对一、一对一、一对多、多对多的配置方法
hihernate一对多关联映射(单向Classes----->Student) 一对多关联映射利用了多对一关联映射原理 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向 ...
- MultiplyVector方法
该方法的功能是用来对方向向量v进行矩阵变换,当矩阵与v进行变换时,只是对v的方向进行转换.那么系统就会对参与变换的Matrix4x4矩阵M进行特殊处理. 例如:经过系统处理后就变为 其中n002 + ...
- c++ list sort
1. bool operator < (S & b) { return ID < b.ID; } struct S { std::string firstn ...
- Java Error: java.lang.UnsupportedClassVersionError: ...bad major version at offset=6
问题分析 报这个错误是指你的jar包或者class 的被编译的jdk版本比当前runtime的jdk版本高. 首先,确定你当前的运行版本: Java代码 Java -version java ve ...
- electron-searchMovies
之前学了electron,前段时间又学了一下vue,为了增加熟练度决定将两者结合做个有趣的东西.想来想去最后决定将原来用 PyQt 写的MovieHeavens重新写一遍,使用electron-vue ...
- 解决 SharePoint 2010 拒绝访问爬网内容源错误的小技巧(禁用环回请求的两种方式)
这里有一条解决在SharePoint 2010搜索爬网时遇到的“拒绝访问错误”的小技巧. 首先要检查默认内容访问帐户是否具有相应的访问权限,或者添加一条相应的爬网规则.如果目标资源库是一个ShareP ...