题解

题面太长无法阅读系列……

这里说的选择改变指的是在下面区间里碰上了一个更长的可匹配的地址,如果可匹配但是匹配长度没有当前的值大,那么不算改变

我们建一个可持久化的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」路由表的更多相关文章

  1. loj #2044. 「CQOI2016」手机号码

    #2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. loj2046 「CQOI2016」路由表

    大傻逼trie树,更傻逼的是我这都没独立想出来,以后要少看题解,多多思考 #include <algorithm> #include <iostream> #include & ...

  3. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  4. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  5. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  6. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  7. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  8. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

  9. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

随机推荐

  1. Showbo.js弹窗实现(jquery)

    一.搭建环境 下载showBo.js和showBo.css 下载链接:https://pan.baidu.com/s/1iUUlKXFNXCBEvBnds4ECIA  密码:its4 显示效果图: 二 ...

  2. 多页面应用 VS 单页面应用

    多页面应用 每一次页面跳转,后端都会返回一个新的HTML文件, 优点:首屏时间快(只经历了一个HTTP请求),SEO效果好 缺点:页面切换慢 单页面应用 进行页面之间跳转时,并不去加载HTML文件,而 ...

  3. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...

  4. codevs 3152 装箱问题3

    装箱问题3 http://codevs.cn/problem/3152/ 题目描述 Description 设有n种物品,记作A1.A2.….An,对应于每个Ai(1<=i<=n)都有一个 ...

  5. Packet Tracer 5.0实验(一) 交换机的Telnet远程登录设置

    一.实验目标 掌握采用telnet方式配置交换机的方法 二.技术原理 配置交换机的管理IP地址(计算机的IP地址与交换机管理IP地址在同一网段): 为telnet用户配置用户名和登录口令: enabl ...

  6. python学习笔记2-tuple

    tuple: #元组也是List,但是值不能变 a=(') print(a[1]) mysql=(',''root','123456') print(mysql.count('root')) #例子 ...

  7. java8 write file 写文件

    1.用BufferedWriter写入文件 //Get the file reference Path path = Paths.get("c:/output.txt"); //U ...

  8. 解析html和采集网页的神兵利器

    HtmlAgilityPack是一个基于.Net的.第三方免费开源的微型类库,主要用于在服务器端解析html文档(在B/S结构的程序中客户端可以用Javascript解析html).截止到本文发表时, ...

  9. mysql关于“异步复制”“同步复制”“半同步复制”“无损复制”的概念与区别

    异步复制:主把事务写到binlog日志并不管从是否接收或者什么时候接收,commit之后,不会与从发生ack之类的交互. 同步复制:当主提交一个事务,在主向前端返回一个commit成功的指令前,必须保 ...

  10. CSS 实现单边阴影

    box-shadow: 0px -15px 10px -15px #111; 五个值分别为:x y blur spread color 将 spread 设置成 blur 的负值即可 这种只适用于 o ...