我认为 可持久化Trie 主要指 可持久化01Trie

如洛谷P4735

将每个数的异或前缀和转化为二进制,添加前缀0至相同位数,然后从最高位开始插入,类似主席树,每一层都对需要更新的点加入一个新的点,同时统计所有在\(i\)之前的数该位为\(1/0\)的总个数(即siz)。

每次查询,从根节点开始,贪心地选与这一位相反的值,同时用第\(r\)个版本减去第\(l-1\)个版本(类似主席树)。

代码:

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
int ans=0;
while(isdigit(ch))
{
ans=ans*10+ch-48;
ch=getchar();
}
return ans;
}
#define N 300005
struct Trie
{
struct Node
{
int ch[2];
int siz;
};
Node t[N*48];
int ncnt;
int rcnt,rot[N*2];
void insert(int x,int rt)
{
rt=rot[rt];
int cur=rot[++rcnt]=++ncnt;
for(int i=24;i>=0;i--)
{
int tmp=(x>>i)&1;
t[cur].ch[tmp]=++ncnt;
t[cur].ch[tmp^1]=t[rt].ch[tmp^1];
t[cur].siz=t[rt].siz+1;
cur=t[cur].ch[tmp];
rt=t[rt].ch[tmp];
}
t[cur].siz=t[rt].siz+1;
}
int query(int x,int l,int r)
{
// printf("%d %d %d\n",x,l,r);
int ans=0;
int rtl=rot[l-1];
int rtr=rot[r];
for(int i=24;i>=0;i--)
{
int tmp=(x>>i)&1;
if(t[t[rtr].ch[tmp^1]].siz-t[t[rtl].ch[tmp^1]].siz>0)
{
// printf("** %d",i);
ans^=(1<<i);
rtr=t[rtr].ch[tmp^1];
rtl=t[rtl].ch[tmp^1];
}
else
{
rtr=t[rtr].ch[tmp];
rtl=t[rtl].ch[tmp];
}
}
return ans;
}
};
Trie tr;
int main()
{
int n,m;
cin>>n>>m;
int x=0;
tr.insert(0,0);
for(int i=1;i<=n;i++)
{
x^=read();
tr.insert(x,i);
}
char opt[3];
for(int i=1;i<=m;i++)
{
scanf("%s",&opt);
if(opt[0]=='A')
{
x^=read();
tr.insert(x,tr.rcnt);
}
else
{
int l,r,xx;
l=read(),r=read(),xx=read();
printf("%d\n",tr.query(xx^x,l,r));
}
}
return 0;
}

关于可持久化Trie的更多相关文章

  1. HDU 4757 Tree(可持久化Trie+Tarjan离线LCA)

    Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Su ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. 可持久化Trie & 可持久化平衡树 专题练习

    [xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...

  4. HDU 4757 Tree(可持久化trie)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4757 题意:给出一棵树,节点有权值.每次询问x到y的路径上与z抑或的最大值. 思路:可持久化trie. ...

  5. 可持久化trie 学习总结

    QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...

  6. [BZOJ 4103] [Thu Summer Camp 2015] 异或运算 【可持久化Trie】

    题目链接:BZOJ - 4103 题目分析 THUSC滚粗之后一直没有写这道题,从来没写过可持久化Trie,发现其实和可持久化线段树都是一样的.嗯,有些东西就是明白得太晚. 首先Orz ZYF-ZYF ...

  7. bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

    2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] ...

  8. bzoj 2741 分块+可持久化trie

    多个询问l,r,求所有子区间异或和中最大是多少 强制在线 做法: 分块+可持久化trie 1.对于每块的左端点i,预处理出i到任意一个j,()i,j)间所有子区间异或和中最大为多少,复杂度O(\(n\ ...

  9. 【BZOJ2741】【块状链表+可持久化trie】FOTILE模拟赛L

    Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 .. ...

  10. HDU4757--Tree 可持久化trie + LCA

    题意:n个点的树,Q次询问,询问u-v路径上的点的权值与z抑或的最大值. 先考虑,在一个区间上的问题,可以先建一个可持久化的Trie,然后每次询问,就和线段树的操作差不多,从最高位开始考虑选1还是选0 ...

随机推荐

  1. CentOS7中Tomcat的安装和配置

    Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置   当然也可以直接修改Tomcat的配置文件,请自行度娘   1.下载并解压 请先去官网找到需要下载的tom ...

  2. 设计模式课程 设计模式精讲 16-2,3 代理模式Coding-静态代理-1

    1 代码演练 1.1 代码演练1(静态代理之分库操作) 1 代码演练 1.1 代码演练1(静态代理之分库操作) 需求: 订单管理,模拟前置后置方法,模拟分库管理 重点: 重点看订单静态代理,动态数据源 ...

  3. 解决Ubuntu(linux)系统中PHP的curl函数无法使用的问题

    我之前用的Windows的服务器,未出现问题,后来把服务器重装了系统,今天在学微信公众号获取信息的时候,发现curl函数出现了问题...... 解决方法 首先连接上服务器,找到/etc/php/7.0 ...

  4. linux系统下安装两个或多个tomcat(转)

    tomcat不用添加到环境变量中 直接解压两个tomcat   来到第二个tomcat的conf目录下 打开server.xml更改端口: 修改server.xml配置和第一个不同的启动.关闭监听端口 ...

  5. Android 隐藏手机号中间四位和隐藏邮箱地址中间四位

    /** * 手机号用****号隐藏中间数字 * * @param phone * @return */public static String settingphone(String phone) { ...

  6. 一、iBatis进行分页查询

    1.ibatis理解: iBatis属于半自动化的ORM框架,我们需要编写SQL语句,由iBatis进行数据库访问,返回结果.而iBatis可以为我们做的更多,比如对查询参数集合.结果.分页查询.事务 ...

  7. Python—网络通信编程之udp通信编程

    服务端代码 import socket # 1.创建实例,即数据报套接字 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.绑 ...

  8. Masonry与UITableView+FDTemplateLayoutCell搭配使用

    打个小广告:本人开发了一个宠物相关的App,欢迎大家下载体验~ 下载二维码: 进入正文: 之前发过一篇博客,也是对这两个的练习使用,但是之后遇到些问题,所以删除重写了.抱歉 Masonry是一款轻量级 ...

  9. 学习:java原理—反射机制

      一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程 ...

  10. mybatis insert后返回主键ID

    需求: mybatis  在添加记录时需要获取到记录主键id id=0 无法获取主键id的值 在插入方法中添加如下属性和相应的值 <insert useGeneratedKeys="t ...