开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
cppCode
/
Acwing256MaximumxORSum.cpp
cppCode
/
Acwing256MaximumxORSum.cpp
Acwing256MaximumxORSum.cpp 2.55 KB
一键复制 编辑 原始数据 按行查看 历史
util6 提交于 2022年01月21日 16:37 +08:00 . 默认的
#include "bits/stdc++.h"
/**
* 题目要求支持2种操作:
* 1:向序列末尾添加一个数
* 2:查询每个[l,r]区间内找一个数p,使[p^...N^x]的值最大,N为当下序列的长度
* 思路:看到[连续的数的异或]就应该想到前缀树+前缀和,但时间复杂度为n2
* 优化:如果每插一个数都存下当前从[1...N]中,满足条件的最大值需要nlogn,这种能存下每个历史版本的trie树就是[可持久化trie树]
* 完善:以上思路只能解决区间在[1,r]时,题目要求[l,r]。所以想到了每个节点存1个[满足条件的所有p中下标最大的那个下标,且这个下标必须大于等于l]
*/
using namespace std;
const int N = 600010, M = N * 25;
int n, m;
//注意,这里要开M,因为每个数的范围是10e7,大约是24位二进制数
int tr[M][2];
//用来存前缀异或和
int q[N];
//存每个数的根节点编号
int root[N];
//节点编号
int idx;
int max_id[M];
/**
* 每插进来一个新的数,相当于加入一条路径
* @param i 前缀和数组的下标
* @param p 上个版本根节点的下标
* @param q 当前版本根节点的下标
* @param k 当前处理到了二进制位的第几位(因为要用递归的写法,所以要传这个参数)
*/
void insert(int i, int p, int q) {
max_id[q] = i;
for(int k = 23; k >=0; k--) {
int v = q[i] >> k & 1;
//如果新的路径走了已经存在的节点,就复制原来的信息
if (p) {
tr[q][v ^ 1] = tr[p][v ^ 1];
}
//否则就开一个新的点
tr[q][v] = ++idx;
max_id[tr[q][v]] = i;
q = tr[q][v], p = tr[p][v];
}
}
int query(int first, int p, int l) {
int q = first;
for (int i = 23; i >= 0; i--) {
int v = p >> i & 1;
int b = tr[q][v ^ 1];
if (b && max_id[b] >= l) {
q = tr[q][v ^ 1];
} else {
q = tr[q][v];
}
}
return q[max_id[q]] ^ p;
}
int main() {
cin >> n >> m;
max_id[0] = -1;
root[0] = ++idx;
insert(0, 0, root[0]);
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
q[i] = q[i - 1] ^ a;
root[i] = ++idx;
insert(i, root[i - 1], root[i]);
}
char op;
int l, r, x;
while (m--) {
cin >> op;
if (op == 'Q') {
cin >> l >> r >> x;
cout << query(root[r - 1], q[n] ^ x, l - 1) << endl;
} else {
cin >> x;
root[++n] = ++idx;
q[n] = q[n - 1] ^ x;
insert(n, root[n - 1], root[n]);
}
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

暂无描述
取消

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liuyutaocode/cppCode.git
git@gitee.com:liuyutaocode/cppCode.git
liuyutaocode
cppCode
算法刷题c++
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /