Nikitosh 和异或(trie树)
题目:
#10051. 「一本通 2.3 例 3」Nikitosh 和异或
解析:
首先我们知道一个性质\(x\oplus x=0\)
我们要求$$\bigoplus_{i = l}^ra_i$$的话,相当于求$$(\bigoplus_{i = 1}^la_i)\oplus (\bigoplus_{i = 1}^ra_i)$$
所以我们维护一个异或前缀和\(sum_i\)
我们用\(l_i\)表示从左往右到第\(i\)位时的区间最大异或和
\(r_i\)表示从右往左到第\(i\)位时的区间最大异或和
显然\(l_i = max\{sum_L\oplus sum_R\}1\leq L<R\leq i\)
\(r_i\)同理
最后枚举求和\(ans=max\{ans,l_i+r_{i+1}\}\)
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5e6 + 10;
int n, m, num, ans;
int a[N], sum[N], l[N], r[N];
struct node {
int nx[2];
} e[N];
void insert(int x) {
bitset<35>b(x);
int rt = 0;
for (int i = 30; i >= 0; --i) {
int v = (int)b[i];
if (!e[rt].nx[v]) e[rt].nx[v] = ++num;
rt = e[rt].nx[v];
}
}
int query(int x) {
bitset<35>b(x);
int rt = 0, ret = 0;
for (int i = 30; i >= 0; --i) {
int v = (int)b[i];
if (e[rt].nx[v ^ 1]) ret = ret << 1 | 1, rt = e[rt].nx[v ^ 1];
else ret <<= 1, rt = e[rt].nx[v];
}
return ret;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), sum[i] = sum[i - 1] ^ a[i];
insert(0);
for (int i = 1; i <= n; ++i) {
ans = max(ans, query(sum[i]));
l[i] = ans;
insert(sum[i]);
}
num = ans = 0;
memset(e, 0, sizeof e);
for (int i = n; i >= 1; --i) {
ans = max(ans, query(sum[i]));
r[i] = ans;
insert(sum[i]);
}
ans = 0;
for (int i = 1; i < n; ++i) ans = max(ans, l[i] + r[i + 1]);
cout << ans;
}
Nikitosh 和异或(trie树)的更多相关文章
- 【Trie】Nikitosh 和异或
[参考博客]: LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie [题目链接]: https://loj.ac/problem/10051 [题意]: 找出两个不相交区 ...
- Trie树/字典树题目(2017今日头条笔试题:异或)
/* 本程序说明: [编程题] 异或 时间限制:1秒 空间限制:32768K 给定整数m以及n个数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【BZOJ】4260: Codechef REBXOR【Trie树】【前后缀异或最大】
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2218 Solved: 962[Submit][Stat ...
- [BZOJ4103][Thu Summer Camp 2015]异或运算 可持久化Trie树
4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec Memory Limit: 512 MB Description 给定长度为n的数列X={x1 ...
- bzoj 3261: 最大异或和 (可持久化trie树)
3261: 最大异或和 Time Limit: 10 Sec Memory Limit: 512 MB Description 给定一个非负整数序列 {a},初始长度为 N. ...
- 【9.15校内测试】【寻找扩展可行域+特判】【Trie树 异或最小生成树】【模拟:)】
之前都没做出来的同名题简直留下心理阴影啊...其实这道题还是挺好想的QAQ 可以发现,鸟可以走到的点是如下图这样扩展的: 由$(0,0)$向两边扩展,黑色是可以扩展到的点,红色是不能扩展的点,可以推出 ...
- BZOJ4103 [Thu Summer Camp 2015]异或运算 【可持久化trie树】
题目链接 BZOJ4103 题解 一眼看过去是二维结构,实则未然需要树套树之类的数据结构 区域异或和,就一定是可持久化\(trie\)树 观察数据,\(m\)非常大,而\(n\)和\(p\)比较小,甚 ...
- 【BZOJ3261】最大异或和 Trie树+贪心
[BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个 ...
随机推荐
- How to receive a million packets per second
Last week during a casual conversation I overheard a colleague saying: "The Linux network stack ...
- DNA replication timing数据库 - Replication Domain
DNA Replication Timing ReplicationDomain: a visualization tool and comparative database for genome-w ...
- numpy的文件存储.npy .npz 文件详解
Numpy能够读写磁盘上的文本数据或二进制数据. 将数组以二进制格式保存到磁盘 np.load和np.save是读写磁盘数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 ...
- Python知乎上推荐的项目
原文地址:https://www.zhihu.com/question/29372574/answer/88744491 作者:Wayne Shi链接:https://www.zhihu.com/qu ...
- jQuery-webcam使用
基本页面 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- Java学习-054-Mybatis IN查询,通过 foreach 获取列表数据
通过如下语句查询商品订单信息: ,,,) 在 Mapper.java 中定义如下接口: List<GoodsOrder> findGoodsOrderByIds(String ids); ...
- asp.net 的log4net的helper类
using log4net; using System; using System.Diagnostics; namespace MxWeiXinPF.Common.log { public stat ...
- java多线程(三)线程的安全问题
1.1. 什么是线程安全 如果有多个线程同时运行同一个实现了Runnable接口的类,程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的:反之,则是线程不 ...
- Java jsoup获取网页中的图片
获取图片 package com.vfsd.net; import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...
- iOS - NSURLConnection finished with error - code -1002
网络请求会异常,比如报错:Error domain: 在回调的地方打一个断点,然后用命令行查看下什么错误: po error 当错误是:**[Error Domain=NSURLErrorDomain ...