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 & ...
随机推荐
- Win7系统的任务管理器显示不全
Win7系统的任务管理器显示不全:如下图所示 首先要说明的是:出现这种现象是正常的,因为这种样式是任务管理器的精简模式. 还原方法:双击任务管理器四周的空白边框,即可恢复初始模式. 效果图如下:
- P3195 [HNOI2008]玩具装箱TOY
列出DP方程式:设f[i]表示分组完前i件物品的最小花费,为方便计算,设sum[i]表示是前i件物品的长度和. f[i]=min(f[j]+(sum[i]-sum[j]+i-j-L-1)^2) [0& ...
- php判断一个数组是否为另一个数组子集的方法
原文地址http://www.jbxue.com/article/14703.html // 快速的判断$a数组是否是$b数组的子集 $a = array(135,138); $b = array ...
- Java IO详解(三)------字节输入输出流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- jQueryMobile的按钮样式
好吧,已经学了jQueryMobile一年了,今天心血来潮,想要写一篇关于jQueryMobile的博客文章,记得去年暑假在公司实习jQueryMobile,想一想真是怀念当时还是菜鸟的自己,年轻就是 ...
- Linux中一个网卡含有多个IP,将从IP升级为主IP的方法
今天在查看虚拟机的时候,发现某一网卡含有多个IP地址: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fas ...
- 允许Ubuntu系统下Mysql数据库远程连接
第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 或者改为: bind-ad ...
- WPF编程,通过【帧】动态更改控件属性的一种方法。
原文:WPF编程,通过[帧]动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...
- 解决 idea 中的 tomcat控制台 和cmd tomcat下的中文乱码问题(win10 64位)
原理:idea控制台里的日志默认是从tomcat的localhost.log 和 catalina.log 两个文件中读出来的. https://blog.csdn.net/zhaijingkui/a ...
- it面试技巧
一:请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有.其实,企业最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识领域 ...