利用可持久化Trie树实现范围内取值异或最大值

如果标题没有表达清楚意思,可以看这里的题干:

然后根据异或的性质,异或一个数两次相当于没有异或,那么我们可以维护一个异或前缀和

有了异或前缀和之后我们就可以通过前缀和的形式O(1)提取出任意的一个异或区间出来

然后就可以把题目转化成这样的形式

求max(b[p]^b[n]^x) (l-1<=p<=r-1)

这里只有b[p]是不知道的,我们提前把序列的异或前缀和预处理出来之后插入到可持久化Tire树里面,又因为b[n]和x是定值,这就又转化成上一篇博文中描述的问题了

只不过这里插入到Trie树里面的东西不是独立的,而是一个整体,我们要从这个整体异或中提取出关键的那一个结果来,由于我们的p是限定了范围的,那么这就相当于对应了一系列的前缀和

范围内的每一个结果都是可行的,因此我们凭借着贪心的时候能取最大取最大的思路,如果在当前Trie树里得不到局部最优解,就跳跃到另一颗更优的Trie树上进行就好了

可持久化的思想就是每一个版本的树的儿子之间乱跳

 #include<cstdio>
const int maxn=;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int a[maxn],b[maxn],bin[],root[maxn];
struct Trie
{
int cnt;
int ch[maxn*][],sum[maxn*];
int insert(int x,int val)
{
int tmp,y;
tmp=y=++cnt;
for(int i=;i>=;i--)
{
ch[y][]=ch[x][];
ch[y][]=ch[x][];
sum[y]=sum[x]+;
int t=val&bin[i];t>>=i;
x=ch[x][t];
ch[y][t]=++cnt;
y=ch[y][t];
}
sum[y]=sum[x]+;
return tmp;
}
int query(int l,int r,int val)
{
int tmp=;
for(int i=;i>=;i--)
{
int t=val&bin[i];t>>=i;
if(sum[ch[r][t^]]-sum[ch[l][t^]])
tmp+=bin[i],r=ch[r][t^],l=ch[l][t^];
else r=ch[r][t],l=ch[l][t];
}
return tmp;
}
}trie;
int main()
{
bin[]=;
for(int i=;i<;i++) bin[i]=bin[i-]<<;
n=read();m=read();
n++;
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) b[i]=b[i-]^a[i];
for(int i=;i<=n;i++)
root[i]=trie.insert(root[i-],b[i]);
char ch[];
int l,r,x;
while(m--)
{
scanf("%s",ch);
if(ch[]=='A')
{
n++;
a[n]=read();b[n]=b[n-]^a[n];
root[n]=trie.insert(root[n-],b[n]);
}
else
{
l=read();r=read();x=read();
printf("%d\n",trie.query(root[l-],root[r],b[n]^x));
}
}
return ;
}

数据结构&字符串:可持久化字典树的更多相关文章

  1. 数据结构&字符串:01字典树

    利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 H ...

  2. HDU 4757 Tree 可持久化字典树

    Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...

  3. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  4. 【HDU 6191】Query on A Tree 【可持久化字典树】

    题目 给出一棵有n个结点的树,树根是1,每个结点给出一个value.然后给出q个询问,每个询问给出两个整数u和x,你要在以u结点为根的子树中找出一个结点v,使得val[v] xor x最大, 并输出这 ...

  5. 【BZOJ 3261】最大异或和【可持久化字典树】

    题意 给出一个长度为n的整数序列,给出m个操作.操作有两种.1,Ax表示在序列结尾增加x.2,Qlrx表示找到一个位置p满足 l<=p<=r,使得a[p] xor a[p+1]xor... ...

  6. bzoj 3261 最大异或和 可持久化字典树(01树)

    题目传送门 思路: 由异或的性质可得,题目要求的式子可以转化成求$max(pre[n]^x^pre[i])$,$pre[i]$表示前缀异或和,那么我们现在就要求出这个东西,所以用可持久化字典树来求,每 ...

  7. 【AC自动机】【字符串】【字典树】AC自动机 学习笔记

    blog:www.wjyyy.top     AC自动机是一种毒瘤的方便的多模式串匹配算法.基于字典树,用到了类似KMP的思维.     AC自动机与KMP不同的是,AC自动机可以同时匹配多个模式串, ...

  8. HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)

    题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...

  9. SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

    You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 231, 1 ≤ N ≤ 12000). A query is defin ...

  10. Hdu-4757 Tree(可持久化字典树+lca)

    题目链接:点这 我的github地址:点这     Problem Description   Zero and One are good friends who always have fun wi ...

随机推荐

  1. 团队作业7——第二次项目冲刺(Beta版本)-第二篇

    1.工作分工: 团队成员 分工 郭达22120 项目整合,后台代码 刘德培44060 数据库模块 石浩洋22061 前台界面优化 曾繁钦22056 前台界面优化.测试 孙斌22030 后台代码 2.燃 ...

  2. 二叉树及其遍历方法---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉树 1.1 二叉树的定义   二叉树是一种特殊的树,它具有以下特点:   (1)树中每个节点最多只能有两棵树,即每个节点的度最多为2 ...

  3. python学习第二天-基本数据类型常用方法

    1.直入主题 python中基本的数据类型有 数字(整形,长整形,浮点型,复数) 字符串 字节串:在介绍字符编码时介绍字节bytes类型 列表 元组 字典 集合 下面我们直接将以下面几个点进行学习 # ...

  4. 201621044079WEEK作业08-集合

    作业08-集合 1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 如 ...

  5. android gradle打包常见问题及解决方案

    背景: 问题: Q1: UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: Java heap space at com.android.d ...

  6. 第一章 持续集成jenkins工具使用之部署

    1.1 硬件要求 内存:至少512MB 磁盘空间:10G JDK8 最好同时安装jre 从官网https://jenkins.io/download/下载最新的war包(Generic Java Pa ...

  7. Windows资源监控工具大全

    在利用LoadRunner进行性能测试的时候,Windows服务器的资源是经常需要监控的对象.其实除了LoadRunner提供的计数器,似乎Window服务器并不像Unix或者Linux提供众多的性能 ...

  8. solr 学习之数据导入

    将数据库中的数据导入到我们的solr索引库中(DataImportHandler) 1.将jdbc的jar包和solr包中的DataImport的jar包拷贝到webapp中solr/WEB-INF/ ...

  9. BZOJ4237 稻草人(分治+树状数组+单调栈)

    如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...

  10. 详细图解jQuery对象,以及如何扩展jQuery插件

    详细图解jQuery对象,以及如何扩展jQuery插件 早几年学习前端,大家都非常热衷于研究jQuery源码.我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来 ...