容易想到题解。

总结一下区间异或和题:

1.转化成trie

2.注意空间稍微开大

3.不要一个数右移31位

4.考虑开头要不要插一个零

5.注意可持久get的时候区间是左开右闭,但这样会变成x-2,x=1时有问题,将x-2=-1的情况变到n+1

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
typedef long long LL;
const int M=600030;
inline int rd(){
    int x=0;bool f=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=0;
    for(;isdigit(c);c=getchar())x=x*10+c-48;
    return f?x:-x;
}

int n,m;
int a[M];
int root[M];
int ch[M*26][2];
int sz[M*26];
int tot;

int cpynode(int x){
    tot++;
    ch[tot][0]=ch[x][0];
    ch[tot][1]=ch[x][1];
    sz[tot]=sz[x]+1;
    return tot;
}

int ins(int rt,int d){
    int tmp,x,y,k;
    tmp=x=cpynode(rt);
    for(int i=23;i>=0;i--){
        k=(d>>i)&1;
        y=cpynode(ch[x][k]);
        ch[x][k]=y;
        x=y;
    }
    return tmp;
}

int get(int lt,int rt,int d){
    int k,res=0;
    for(int i=23;i>=0;i--){
        k=((d>>i)&1)^1;
        if(sz[ch[rt][k]]-sz[ch[lt][k]]>0) lt=ch[lt][k],rt=ch[rt][k],res+=(1<<i);
        else lt=ch[lt][k^1],rt=ch[rt][k^1];
    }
    return res;
}

int main(){
    char s[7];
    int i,x,y,z;
    n=rd(),m=rd();
    for(i=1;i<=n;i++) a[i]=rd();
    for(i=2;i<=n;i++) a[i]^=a[i-1];
    root[0]=ins(root[0],0);
    for(i=1;i<=n;i++) root[i]=ins(root[i-1],a[i]);
    for(i=1;i<=m;i++){
        scanf("%s",s);
        if(s[0]=='A'){
            x=rd();
            n++;
            a[n]=a[n-1]^x;
            root[n]=ins(root[n-1],a[n]);
        }
        else if(s[0]=='Q'){
            x=rd(),y=rd(),z=rd();
            z^=a[n];
            printf("%d\n",get(root[(x-2)>=0?(x-2):(n+1)],root[y-1],z));
        }
    }
    return 0;
}

bzoj3261 可持久化trie的更多相关文章

  1. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

  2. bzoj3261: 最大异或和 可持久化trie

    题意:给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满 ...

  3. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  4. BZOJ3261: 最大异或和(可持久化trie树)

    题意 题目链接 Sol 设\(sum[i]\)表示\(1 - i\)的异或和 首先把每个询问的\(x \oplus sum[n]\)就变成了询问前缀最大值 可持久化Trie树维护前缀xor,建树的时候 ...

  5. 【bzoj3261】【最大异或和】可持久化trie树+贪心

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非 ...

  6. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.       有M个操作,有以下两种操作类型:1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2.Q l r x:询问操 ...

  7. [BZOJ3261] 最大异或和 (异或前缀和,可持久化Trie)

    Description 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Q l r x:询问操作, ...

  8. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  9. 【BZOJ3261】最大异或和(可持久化Trie)

    题意: 思路:可持久化Trie板子题,支持序列插入和询问 #include<bits/stdc++.h> using namespace std; typedef long long ll ...

随机推荐

  1. jQuery 的 $("someobjectid”).event() 的绑定

    经验证,jquery 的 $("someobjectid”).event()事件绑定,如果放在某个会被重新初始化的对象里,就会被多次绑定. 如下 <div id="divID ...

  2. MyBatis的动态SQL操作--插入

    需求:向数据库中插入一条数据 //id,name,sal非空,三个字段都插入 insert into student(id,name,sal) values (?,?,?) //id,name非空,只 ...

  3. JavaEE的13种核心技术

    Java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JavaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于We ...

  4. RabbitMQ消息队列(一): Detailed Introduction 详细介绍(转)

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  5. Java 简单的加密解密算法

    package cn.std.util; import java.nio.charset.Charset; public class DeEnCode { private static final S ...

  6. Magic skills of vim from zhihu

    https://www.zhihu.com/question/27478597 插入模式下ctrl-y,重复当前光标上一行的字符 gd 高亮当前词 cc 删除当前行并插入 “.” 这个 mark 代表 ...

  7. Extension Method[上篇]

    在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object i ...

  8. MSSQL复制功能实现与Oracle数据库同步

    1.分别建立链接对数据库进行操作,SQLServer可以用ADO.NET,操作Oracle可以用OLEDB或者用System.Data.OracleClient(需要添加引用才能用) 这种方案的优点就 ...

  9. poj2352Stars

    http://poj.org/problem?id=2352 二维逆序数 按一个数排序 转化为1维的 之前用树状数组写过 这次用线段树敲了下 #include <iostream> #in ...

  10. Flash挡住DIV的解决方法

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...