题解

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

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

我们建一个可持久化的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. P4782 【模板】2-SAT 问题 && 2-SAT问题

    2-SAT到图论 \(k-SAT\) 是 k-适应性问题(Satisfiability)的简称. \(k-SAT\) 问题(除 \(k = 2\))已被证明为是 \(NP\) 完全问题, 而对于 \( ...

  2. Java7的新特性

    原文出处:xixicat 序 本文主要讲Java7的新特性,相对于Java6而言,Java7增加了一些重要的特性,比如NIO2,不像Java6那么鸡肋,也算是一个重要的版本. 特性列表 suppres ...

  3. [非常重要的总结] Linux C相关函数

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  4. 视音频数据处理入门:UDP-RTP协议解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  5. typedef 与 #define的区别

    typedef 与 #define的区别 整理于一篇经典blog,经典原文地址http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.ht ...

  6. [转载]WCF和ASP.NET Web API在应用上的选择

    http://www.cnblogs.com/shanyou/archive/2012/09/26/2704814.html http://msdn.microsoft.com/en-us/libra ...

  7. Linux学习2-fork

    复制进程映像 fork() 要想让进程同时执行多个函数,我们可以使用线程或从源程序中创建一个完全分离的进程,后者就像init的做法一样,而不像exec调用那样用新程序替换当前指向的线程. 我们可以通过 ...

  8. 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)

    [题意]给定k<=123,a,n,d<=10^9,求: $$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$ [算法]拉格朗日 ...

  9. slice层解析

    如果说之前的Concat是将多个bottom合并成一个top的话,那么这篇博客的slice层则完全相反,是把一个bottom分解成多个top,这带来了一个问题,为什么要这么做呢?为什么要把一个低层的切 ...

  10. Python基础入门(一)

    1.在线教程 2.Python下载地址,安装步骤,就是next.next... 3.配置环境变量(win8) 电脑 --> 属性 --> 高级系统设置 --> 环境变量,找到系统变量 ...