BZOJ4628 BJOI2016IP地址(trie)
离线,每次修改相当于对该规则的所有匹配点的值+1,考虑在trie上打加法标记和匹配标记,匹配标记不下传,加法标记下传遇到匹配标记时清空。注意是用b时刻前缀-a时刻前缀,而不是(a-1)时刻前缀,具体我也不知道为啥可能是我没看懂题。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,cnt,ans[N],root;
struct data{int ch[],x,tag,lazy;
}tree[N<<];
struct bit{int x,n,id;};
struct data2{int op;bit ip;
}q[N];
bit gettwo()
{
unsigned int x=,cnt=;char c=getchar();
while (c<''||c>'') c=getchar();
while (c>=''&&c<='') x+=(c^)<<cnt,cnt++,c=getchar();
return (bit){x,cnt};
}
vector<bit> INS[N],DEL[N];
void update(int k,int x){if (!tree[k].tag) tree[k].x+=x,tree[k].lazy+=x;}
void down(int k)
{
if (!tree[k].ch[]) tree[k].ch[]=++cnt;
update(tree[k].ch[],tree[k].lazy);
if (!tree[k].ch[]) tree[k].ch[]=++cnt;
update(tree[k].ch[],tree[k].lazy);
tree[k].lazy=;
}
void ins(int &k,bit x,int p)
{
if (!k) k=++cnt;
if (p==x.n) {update(k,),tree[k].tag++;return;}
if (tree[k].lazy) down(k);
ins(tree[k].ch[(x.x&(<<p))>],x,p+);
}
void del(int &k,bit x,int p)
{
if (!k) k=++cnt;
if (p==x.n) {tree[k].tag--,update(k,);return;}
if (tree[k].lazy) down(k);
del(tree[k].ch[(x.x&(<<p))>],x,p+);
}
int query(int k,bit x,int p)
{
if (!k) return ;
if (p==x.n) return tree[k].x;
if (tree[k].lazy) down(k);
return query(tree[k].ch[(x.x&(<<p))>],x,p+);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4628.in","r",stdin);
freopen("bzoj4628.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
{
char c=getc();if (c=='A') q[i].op=;else q[i].op=-;
q[i].ip=gettwo();
}
for (int i=;i<=m;i++)
{
bit x=gettwo();x.id=i;
DEL[read()].push_back(x);
INS[read()].push_back(x);
}
for (int i=;i<=n;i++)
{
if (q[i].op==) ins(root,q[i].ip,);else del(root,q[i].ip,);
for (int j=;j<INS[i].size();j++) ans[INS[i][j].id]+=query(root,INS[i][j],);
for (int j=;j<DEL[i].size();j++) ans[DEL[i][j].id]-=query(root,DEL[i][j],);
//for (int j=1;j<=cnt;j++) cout<<tree[j].ch[0]<<' '<<tree[j].ch[1]<<' '<<tree[j].x<<' '<<tree[j].tag<<' '<<tree[j].lazy<<endl;cout<<endl;
}
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}
BZOJ4628 BJOI2016IP地址(trie)的更多相关文章
- Trie树的应用:查询IP地址的ISP
1. 问题描述 给定一个IP地址,如何查询其所属的ISP,如:中国移动(ChinaMobile),中国电信(ChinaTelecom),中国铁通(ChinaTietong)?现有ISP的IP地址区段可 ...
- [LeetCode] Implement Trie (Prefix Tree) 实现字典树(前缀树)
Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...
- 【BZOJ-4523】路由表 Trie树 + 乱搞
4523: [Cqoi2016]路由表 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 155 Solved: 98[Submit][Status][ ...
- [知识点]Trie树和AC自动机
// 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...
- 字典树(Trie Tree)
在图示中,键标注在节点中,值标注在节点之下.每一个完整的英文单词对应一个特定的整数.Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的.键不需要被显式地保存在节点中. ...
- CodeForces #367 div2 D Trie
题目链接:Vasiliy's Multiset 题意:这里有一个set容器,有三种操作,+ num, - num, ? num,分别代表往容器里加上num,或者拿走num,或着从容器里找一个数temp ...
- 从Trie谈到AC自动机
ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...
- [转]数据结构之Trie树
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
- 利用Trie树对字符串集合进行排序并计算特征值
该算法用于将一组乱序的字符串反序列化到一个Trie树中,这个过程即可视为对字符串进行了一次排序. 还可以通过调用 GetFeatureString 将该 Trie 树重新序列化. #include & ...
随机推荐
- httpclient介绍与使用
什么是httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HT ...
- Android 绘图时实现双缓冲
一.双缓冲技术原理: 在内存中创建一片内存区域,把将要绘制的图片预先绘制到内存中,在绘制显示的时候直接获取缓冲区的图片进行绘制.更具体一点来说:先通过setBitmap方法将要绘制的所有的图形绘制到一 ...
- Oracle substr() instr() 用法
转载:oracle中substr() instr() 用法 substr(字符串,截取开始位置,截取长度) = 返回截取的字符串instr(源字符串,目标字符串,起始字符串,匹配字符串) = 返回要截 ...
- Linux常用系统信息查看命令
[转]http://yulans.cn/linux/linux%E5%B8%B8%E7%94%A8%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF%E6%9F%A5%E7%9C ...
- Swift10大开源项目记录
Alamofire : Swift编写的HTTP网络库,用于异步网络通信. Surge: Surge基于Accelerate框架开发,用于执行矩阵数学.数字信号处理以及图像处理等方面. SwiftyJ ...
- redis系列--你真的入门了吗?redis4.0入门~
前言 redis作为nosql家族中非常热门的一员,也是被大型互联网公司所青睐,无论你是开发.测试或者运维,学习掌握它总会为你的职业生涯增色添彩. 当然,你或多或少已经了解redis,但是你是否了解其 ...
- [转]Linux 系统挂载数据盘
原文地址:http://blog.csdn.net/jeep_ouc/article/details/39289643 *Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化 ...
- Luogo P2324 [SCOI2005]骑士精神
所有想练习A*的人都先来敲一下这道题吧. 数据范围即便只有5*5,但朴素的爆搜还是会超时. 因此考虑剪枝. 对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者 ...
- centos7 部署 nginx+tomcat+MariaDB 环境并安装安全狗,使用natapp隧道
jdk安装: -openjdk 参考:https://blog.csdn.net/dhr201499/article/details/81626466 tomcat安装: 使用版本:8.5.37 参考 ...
- linux AB web 性能测试工具
ab(选项)(参数) 选项 -A:指定连接服务器的基本的认证凭据: -c:指定一次向服务器发出请求数: -C:添加cookie: -g:将测试结果输出为“gnuolot”文件: -h:显示帮助信息: ...