https://www.luogu.org/problemnew/show/P4735

令 s 数组为 a 数组的异或前缀,则题目要求的式子可变为 s[p - 1] ^ s[n] ^ x,s[n] ^ x不变,则可以高效的从高位到低位贪心,凑出一个和 s[n] ^ x 异或最大的值,查询一个区间内的 s 值可用可持久化 trie 实现,方法与主席树类似,这里不再赘述

#include <bits/stdc++.h>
using namespace std; const int N = 600000 + 10; int trie[N * 26][2], siz[N * 26], tot = 0;
int s[N], root[N], n, m; template <typename T>
inline void read(T &f) {
f = 0; T fu = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') fu = -1; c = getchar();}
while(c >= '0' && c <= '9') {f = (f << 3) + (f << 1) + (c & 15); c = getchar();}
f *= fu;
} void ins(int &u, int pre, int d, int x) {
u = ++tot; siz[u] = siz[pre] + 1; if(d == -1) return;
trie[u][0] = trie[pre][0]; trie[u][1] = trie[pre][1];
int now = (x & (1 << d)) >> d; ins(trie[u][now], trie[pre][now], d - 1, x);
} int find(int l, int r, int d, int x) {
if(d == -1) return 0;
int now = ((x & (1 << d)) >> d) ^ 1;
if(siz[trie[r][now]] - siz[trie[l][now]]) return (1 << d) * now + find(trie[l][now], trie[r][now], d - 1, x);
return (1 << d) * (now ^ 1) + find(trie[l][now ^ 1], trie[r][now ^ 1], d - 1, x);
} int main() {
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
int a; read(a);
s[i] = s[i - 1] ^ a;
ins(root[i], root[i - 1], 23, s[i - 1]);
}
for(int i = 1; i <= m; i++) {
char c = getchar();
while(c != 'A' && c != 'Q') c = getchar();
if(c == 'A') {
int a; read(a); n++;
s[n] = s[n - 1] ^ a;
ins(root[n], root[n - 1], 23, s[n - 1]);
} else {
int l, r, x;
read(l); read(r); read(x);
int Ans = s[n] ^ x;
// 在 l 和 r 之间找和 Ans ^ 最大的
printf("%d\n", find(root[l - 1], root[r], 23, Ans) ^ Ans);
}
}
return 0;
}

luoguP4735 最大异或和的更多相关文章

  1. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  2. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  3. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  4. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  5. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  6. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  7. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

  8. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...

  9. 异或之(bzoj 3689)

    Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...

随机推荐

  1. js操作一般文件和csv文件

    js操作一般文件和csv文件 将文本文件读成字符串 <input type="file" id="upload"> document.getElem ...

  2. java成神之——接口,泛型,类

    接口 接口定义 默认方法 函数式接口 泛型 泛型类 泛型类继承 类型限定 泛型方法 泛型接口 类 构造函数 类的继承 抽象类 instanceof运算符 内部类 equals 结语 接口 接口定义 j ...

  3. php各版本编译好的扩展模块下载地址

    php各版本[,x86/64  v9/v11/v14  nts/ts]编译好的扩展模块下载地址: https://windows.php.net/downloads/pecl/releases/ ht ...

  4. C#读写EXCEL(二)

    C#读写EXCEL(二) -- ::| 分类: 默认分类 | 标签: |举报 |字号大 中 小 订阅 用微信 “扫一扫” 将文章分享到朋友圈. 用易信 “扫一扫” 将文章分享到朋友圈. 下载LOFTE ...

  5. 【287】◀▶ arcpy 常用类说明

    ArcPy 类列表(按字母顺序) 01   Raster 创建一个可在 Python 脚本或地图代数表达式中使用的栅格对象. 02   Cursor Cursor 是一种数据访问对象,可用于在表中迭代 ...

  6. LINQ GroupBy 查询数据赋给select

    roles.GroupBy(a => new { a.SubjectID,a.SubjectName}).Select(p => new SelectListItem() { Value ...

  7. 解决mybatis中转义字符的问题

    xml格式中不允许出现类似“>”这样的字符,有如下两种解决方法 方法一:使用转义字符 SELECT * FROM test WHERE 1 = 1 AND start_date <= CU ...

  8. Yii 2 load() 和 save()

    我这里用的数据库是mongo 数据库 为栗子: public function load($data, $formName = null) { $scope = $formName === null ...

  9. 22-Two(公共子序列的个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  10. sql去除重复记录 且保留id最小的 没用

    第一步:查询重复记录   SELECT * FROM TableName   WHERE RepeatFiled IN (   SELECT RepeatFiled   FROM TableName ...