博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P4735 最大异或和
阅读量:6837 次
发布时间:2019-06-26

本文共 1739 字,大约阅读时间需要 5 分钟。

可持久化\(01Trie\)。感觉不是很会写,改天复习完主席树会再来学一次。

#include 
using namespace std;const int N = 600010;int s[N], rt[N], cnt[N * 25];int max_size = 1, ch[N * 25][2];void ins (int now, int pre, int x) { for (int t = 25; t >= 0; --t) { int i = (x >> t) & 1; ch[now][!i] = ch[pre][!i]; //不修改的 -> 直接连起来 ch[now][i] = ++max_size; //修改的 -> 新建节点 cnt[ch[now][i]] = cnt[ch[pre][i]] + 1; //维护一个数的个数 now = ch[now][i], pre = ch[pre][i]; } //只有在存在新节点的部分,cnt[now] 才会大于 cnt[pre]}int qry (int l, int r, int x) { int ans = 0; for (int t = 25; t >= 0; --t) { int i = (x >> t) & 1; if (cnt[ch[r][!i]] > cnt[ch[l][!i]]) { ans += (1 << t); l = ch[l][!i]; r = ch[r][!i]; } else { l = ch[l][i]; r = ch[r][i]; } //限制其不能向版本更低的地方走 //至少添加一个数, 不在i上就在!i上,不允许向cnt更低的地方走 } return ans;}int n, m, x, l, r; char opt;int main () { cin >> n >> m; rt[0] = ++max_size; ins (rt[0], 0, 0); for (int i = 1; i <= n; ++i) { scanf ("%d", &s[i]); s[i] ^= s[i - 1]; rt[i] = ++max_size; ins (rt[i], rt[i - 1], s[i]); } for (int i = 1; i <= m; ++i) { scanf (" %c", &opt); if (opt == 'A') { scanf ("%d", &x); n = n + 1; s[n] = s[n - 1] ^ x; rt[n] = ++max_size; ins (rt[n], rt[n - 1], s[n]); } else { scanf ("%d %d %d", &l, &r, &x); --l, --r; if(l <= 0) { printf ("%d\n", qry (0, rt[r], x ^ s[n])); } else { printf ("%d\n", qry (rt[l - 1], rt[r], x ^ s[n])); } } } return 0;}

转载于:https://www.cnblogs.com/maomao9173/p/10445368.html

你可能感兴趣的文章
教育“优先”,落实才是关键
查看>>
传统IT大佬们,路在何方?
查看>>
基础练习
查看>>
shell学习笔记 (9.3)
查看>>
用chrome在电脑上模拟微信内置浏览器
查看>>
PHP获取常用时间的总结
查看>>
设计模式6大原则:里氏置换原则
查看>>
hbase0.94.14伪分布式安装
查看>>
Debug记录:vCenter6.5突然不能访问并报错“503 Service Unavailable”
查看>>
自动导出oracle的数据
查看>>
顺序表实现的源码
查看>>
我的友情链接
查看>>
iOS调用系统摄像头和相册
查看>>
mysql文件导入办法(直接copy数据库文件)
查看>>
【二叉树】线索化二叉树
查看>>
mysql的key和index
查看>>
squid windows 配置日志
查看>>
wordpress 安装主题
查看>>
linux磁盘管理及文件系统
查看>>
梭子鱼垃圾邮件网关-Barracuda Spam & Virus Firewall Email Alert: outQueueHigh
查看>>