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 & ...
随机推荐
- 串口通信DMA中断
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影.关于dma网上有许多的资料,亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但是自己本身打字就慢,还有好多事情 ...
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题解决
出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock时,先用tail -5f /var/log/upstart/do ...
- Android下so注入汇总
/** 作者:蟑螂一号* 原文链接:http://www.sanwho.com/133.html* 转载请注明出处*/ Android下so注入是基于ptrace系统调用,因此要想学会andro ...
- c# speech 文本转语言
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Python+Selenium爬取动态加载页面(1)
注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...
- Wpf(Storyboard)动画简单实例
原文:Wpf(Storyboard)动画简单实例 动画的三种变换方式 RotateTransform:旋转变换变化值:CenterX围绕转的圆心横坐标 CenterY纵坐标 Angle旋转角度(角度正 ...
- MFC如何为程序添加图标
1.找几幅Ico格式的图片,可以在电脑中查找.ico一般都会找到.然后将ico文件放在工程目录下的res文件夹下. 2.点击菜单栏->编辑->添加资源->导入,选择res文件夹中将要 ...
- python 回溯法 子集树模板 系列 —— 6、排课问题
问题 某乡村小学有六个年级,每个年级有一个班,共六个班. 周一到周五,每天上6节课,共计30节课. 开设的课程 一年级:语(9)数(9)书(2)体(2)美(2)音(2)德(2)班(1)安(1) 二年级 ...
- libgdx学习记录19——图片动态打包PixmapPacker
libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...
- shell变量常用方法
变量之数组操作: 参考网址:http://www.jb51.net/article/55253.htm #直接赋值 [root@local-]=chengd [root@local-]=xrd [ro ...