【LOJ】#2046. 「CQOI2016」路由表
题解
题面太长无法阅读系列……
这里说的选择改变指的是在下面区间里碰上了一个更长的可匹配的地址,如果可匹配但是匹配长度没有当前的值大,那么不算改变
我们建一个可持久化的trie,查询的时候先在前\(a - 1\)个里找到最长的可以得到的地址
然后再在区间的trie里找到那条链上,如果碰到一个结束点且比我们初始长度大的路径串,就丢进一个栈里,维护栈的递增
最后栈的长度就是答案
代码
#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 1000005
#define pb push_back
#define mp make_pair
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int M;
char s[35];
struct node {
int son[2],siz,ed;
}tr[MAXN * 32];
int Ncnt,rt[MAXN],cnt;
int sta[MAXN],top;
void Insert(int v,int l) {
rt[++cnt] = ++Ncnt;
int *y = &rt[cnt],x = rt[cnt - 1];
tr[*y] = tr[x];
for(int i = 31 ; i >= 31 - l + 1 ; i--) {
int c = (v >> i) & 1;
y = &tr[*y].son[c];x = tr[x].son[c];
*y = ++Ncnt;
tr[*y] = tr[x];
tr[*y].siz++;
}
if(!tr[*y].ed) tr[*y].ed = cnt;
}
int Get_MaxL(int a,int v) {
int p = rt[a];
int res = 0;
for(int i = 31 ; i >= 0 ; --i) {
int c = (v >> i) & 1;
if(tr[p].son[c]) p = tr[p].son[c];
else break;
if(tr[p].ed) res = max(res,31 - i + 1);
}
return res;
}
int Query(int L,int R,int v,int len) {
top = 0;
--L;
int x = rt[L],y = rt[R];
for(int i = 31 ; i >= 0 ; --i) {
int c = (v >> i) & 1;
if(tr[tr[y].son[c]].siz - tr[tr[x].son[c]].siz) {
y = tr[y].son[c];x = tr[x].son[c];
}
else break;
if(tr[y].ed && 31 - i + 1 > len) {
while(top && sta[top] > tr[y].ed) --top;
sta[++top] = tr[y].ed;
}
}
return top;
}
void Solve() {
read(M);
int a,b;
while(M--) {
scanf("%s",s + 1);
if(s[1] == 'A') {
scanf("%s",s + 1);
int L = strlen(s + 1);
int v = 0,now = 0;
for(int i = 1 ; i <= L ; ++i) {
if(s[i] == '.' || s[i] == '/') {
v = v << 8 | now;
now = 0;
}
else now = now * 10 + s[i] - '0';
}
Insert(v,now);
}
else {
scanf("%s",s + 1);
int L = strlen(s + 1);
int v = 0,now = 0;
for(int i = 1 ; i <= L ; ++i) {
if(s[i] == '.') {
v = v << 8 | now;
now = 0;
}
else now = now * 10 + s[i] - '0';
}
v = v << 8 | now;
read(a);read(b);
L = Get_MaxL(a - 1,v);
out(Query(a,b,v,L));enter;
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}
【LOJ】#2046. 「CQOI2016」路由表的更多相关文章
- loj #2044. 「CQOI2016」手机号码
#2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- loj2046 「CQOI2016」路由表
大傻逼trie树,更傻逼的是我这都没独立想出来,以后要少看题解,多多思考 #include <algorithm> #include <iostream> #include & ...
- LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
随机推荐
- Hadoop生态圈-hive五种数据格式比较
Hadoop生态圈-hive五种数据格式比较 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- 转:RAC中比较replay, replayLast, and replayLazily
A co-worker recently asked me about the difference between -replay, -replayLast, and -replayLazily i ...
- 深入剖析linq的联接
内联接 代码如下 from a in new List<string[]>{ ]{"张三","男"}, ]{"李四"," ...
- Linux6.x修改出eth0网卡的解决方法
1. 编辑70-persistent-net配置文件: # -persistent-net.rules 如果没有就新建一个,添加如下内容: # PCI device 0x14e4:0x165f (tg ...
- srpingboot2 session过期时间设置
springboot2 设置session过期的配置 server.servlet.session.timeout = 1800 而不再是 server.session.timeout=1800
- spark科普
普Spark,Spark是什么,如何使用Spark(1)转自:http://www.aboutyun.com/thread-6849-1-1.html 阅读本文章可以带着下面问题:1.Spark基于什 ...
- c++虚函数&重写
虚函数是C++中实现多态的一种方法,父类A的一个函数声明为虚函数,在子类B中覆盖定义之后,当在调用的时候使用A*a=new B(),此时调用对应的那个虚函数的名字,则会执行B中的函数.当父类中没有定义 ...
- Java入门系列(三)面向对象三大特性之封装、继承、多态
面向对象综述 封装 封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道 ...
- 知识笔记:jQuery 事件对象属性小结
使用事件自然少不了事件对象.因为不同浏览器之间事件对象的获取,以及事件对象的属性都有差异,导致我们很难跨浏览器使用事件对象.jQuery中统一了事件对象,当绑定事件处理函数时,会将jQuery格式化后 ...
- 24点扑克牌游戏——(含java源码)(GUI实现)
给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...