【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 ...
随机推荐
- Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发
Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 直接入正题: Screen Shot 2015-09-18 at 16.56.20.png Mac上安装Jekins jekins下 ...
- Spring 中三种Bean配置方式比较
今天被问到Spring中Bean的配置方式,很尴尬,只想到了基于XML的配置方式,其他的一时想不起来了,看来Spring的内容还没有完全梳理清楚,见到一篇不错的文章,就先转过来了. 以前Java框架基 ...
- debian配置网络
http://blog.csdn.net/ypist/article/details/8513274 vim /etc/resolv.conf 配置域名服务器 search test.ivic.o ...
- tp-01 搭建过程
1:拷贝ThinkPHP框架系统文件夹自己的www目录中的tp-shop文件夹中 2:新建自己的项目文件(比如:shop)夹与ThinkPHP框架系统文件夹在同一级目录(当然也可以不同) 3: 在tp ...
- WCF(二)
摘自:http://www.cnblogs.com/yank/p/3666271.html WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK ...
- mysql 中查看指定表的字段名 (可根据字段变量生成c#后台代码)
select DISTINCT data_type from COLUMNS where table_name='表名' 用ConCat();构造生成代码.....
- 刚刚完成了在vs2013中通过 ef连接mysql数据库的工作。感觉没有想象中的简单。试了n次终于成功。故记录成功的方法,希望可以帮到大家
分两种情况,如果你是用entity framework 5.0的时候 mysql-connector-net的版本不是很重要. MySQL For VisualStudio的版本也不重要 (这个不装就 ...
- 小知识(class文件查看jdk版本,beyond,could not find setter)
最近几天工作当中遇到了一些问题,所以记录下来. 1.如何查看class文件的sdk版本 2.beyond compare比对文件 3.Could not find setter for native_ ...
- oracle用sql 语句如何向表中插入时间?
有关日期的操作中,更多的是涉及系统当前时间,用sysdate表示即可,如果是插入其他非系统时间的日期类型数据的话,用to_date转换再插入就可以了.例: insert into 表(c_date) ...
- SQL中查询语句的使用
常用SQL查询语句 - myLittleGarden - 博客园 http://www.cnblogs.com/sunada2005/p/3411873.html 一.简单查询语句 1. 查看表结构 ...