BZOJ4260,LOJ10051 Nikitosh 和异或
题意
给定一个含 \(N\) 个元素的数组 \(A\),下标从 \(1\) 开始。请找出下面式子的最大值:\((A[l_1]\bigoplus A[l_1+1]\bigoplus …\bigoplus A[r_1])+ (A[l_2]\bigoplus A[l_2+1]^…\bigoplus A[r_2])\),其中 \(1\le l_1\le r_1<l_2\le r_2\le N,x\bigoplus y\)表示 \(x\) 和 \(y\) 的按位异或。
对于 \(100\%\) 的数据,\(2\le N \le 4\times 10^5, 0\le A_i\le 10^9\)。
分析
参照qwerta的题解。
首先记录异或前缀和s[i]=a[1]⊕a[2]⊕a[3]...⊕a[i]。
设l[i]为以i结尾的区间中,异或值的最大值。
因为异或有 x⊕x=0 的性质,所以区间 [l,r] 的异或值
=a[l]⊕a[l+1]⊕...⊕a[r]
=(a[1]⊕a[2]⊕a[3]...⊕a[l−1])⊕(a[1]⊕a[2]⊕a[3]...⊕a[r])
=s[l−1]⊕s[r],
所以求l[i],转化为找j<i,使得s[j]⊕s[i]最大。
转化为「LOJ#10050」「一本通 2.3 例 2」The XOR Largest Pair(Trie
以相似的方法可以求出r[i](以i开头的区间中,异或值的最大值)。
时间复杂度:O(N \log_2 A)。
代码
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read()
{
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return data*w;
}
template<class T>il T read(rg T&x)
{
return x=read<T>();
}
typedef long long ll;
using namespace std;
co int N=4e5+1;
int a[N],l[N],r[N];
int bin[31];
void turn(int x)
{
for(int i=0;i<31;++i,x>>=1)
bin[i]=x&1;
}
int tot,ch[N*31][2];
int find()
{
int u=0,res=0;
for(int i=30;i>=0;--i)
{
if(ch[u][bin[i]^1])
res+=(1<<i),u=ch[u][bin[i]^1];
else
u=ch[u][bin[i]];
}
return res;
}
void insert()
{
int u=0;
for(int i=30;i>=0;--i)
{
if(!ch[u][bin[i]])
ch[u][bin[i]]=++tot;
u=ch[u][bin[i]];
}
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n=read<int>();
for(int i=1;i<=n;++i)
read(a[i]);
int x=0;
for(int i=1;i<=n;++i)
{
x^=a[i];
turn(x);
insert();
l[i]=max(l[i-1],find());
// cerr<<i<<" l="<<l[i]<<endl;
}
x=0,tot=0;
memset(ch,0,sizeof ch);
for(int i=n;i>=1;--i)
{
x^=a[i];
turn(x);
insert();
r[i]=max(r[i+1],find());
// cerr<<i<<" r="<<r[i]<<endl;
}
ll ans=0;
for(int i=1;i<n;++i)
ans=max(ans,(ll)l[i]+r[i+1]);
printf("%lld\n",ans);
return 0;
}
BZOJ4260,LOJ10051 Nikitosh 和异或的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- Nikitosh 和异或(trie树)
题目: #10051. 「一本通 2.3 例 3」Nikitosh 和异或 解析: 首先我们知道一个性质\(x\oplus x=0\) 我们要求\[\bigoplus_{i = l}^ra_i\]的话 ...
- 【Trie】Nikitosh 和异或
[参考博客]: LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie [题目链接]: https://loj.ac/problem/10051 [题意]: 找出两个不相交区 ...
- #10051 Nikitosh 和异或
Nikitosh 和异或 其实题意已经简单的不能再简单了,所以就不讲了. 因为题目中 \(1\leq l_1 \leq r_1 <l_2 \leq r_2\leq N\),所以显然对于最终答案, ...
- Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...
- Nikitosh 和异或
题面 设 \(l_{i}\) 为以 \(i\) 为结尾的区间中最大的一段异或值,\(r_{i}\) 为以 \(i\) 为开头的区间中最大的一段异或值. 则有 \[l_{i}=\max\left(l[i ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- [一本通学习笔记] 字典树与 0-1 Trie
字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phon ...
- Trie学习总结
Trie树学习总结 字典树,又称前缀树,是用于快速处理字符串的问题,能做到快速查找到一些字符串上的信息. 另外,Trie树在实现高效的同时,会损耗更多的空间,所以Trie是一种以空间换时间的算法. T ...
随机推荐
- HGVS,非HGVS形式的突变描述解释
NG_012232.1(NM_004006.1):c.93+1G>T: 在该转录本NM_004006.1外显子的第93个碱基的下1个碱基(属于内含子)G变为T. NG_012232.1(NM_0 ...
- 20145219 《Java程序设计》实验三 敏捷开发与XP实践
20145219 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 敏捷开发与XP 1.敏捷开发(Agile Development)是 ...
- python——动态类型简介
动态类型简介 类型属于对象,而不是变量 每一个对象都有两个标准的头部信息:类型标志符和引用计数器. 对象的垃圾收集,就是通过引用计数器实现的.可以在脚本中任意使用对象而不需要考虑释放内存空间. 循环饮 ...
- Oracle数据库PLSQL的中文乱码显示全是问号
plsql连接数据库乱码问题 缘由: 小师妹周末叫我帮她重装数据库,这么大好的周末时光不出去玩儿,给她装数据库这不是很蛋疼么. 我问她为什么要重装,她说:数据存入数据库后,中文字符有乱码,一定是我上次 ...
- Chemistry
Problem A. Chemistry Input file: chemistry.in Output file: chemistry.out Time limit: 1 seconds Memor ...
- bzoj 3479: [Usaco2014 Mar]Watering the Fields
3479: [Usaco2014 Mar]Watering the Fields Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 174 Solved ...
- Javascript -- 级联菜单, javascript解析xml文件
1. cities.xml 保存省份和城市 <?xml version="1.0" encoding="GB2312"?> <china> ...
- ECS vs. Kubernetes 类似而又不同
C2Container Service (ECS)和Kubernetes (K8s) 都解决了同样的问题:跨越主机集群管理容器.ECS和Kubernetes之间的斗争让我想起了vi和Emacs之间的编 ...
- PHP超级全局变量、魔术变量和魔术函数的区别和联系
PHP超级全局变量.魔术变量和魔术函数的区别和联系 一.总结 一句话总结:PHP超级全局变量主要用于web开发,魔术变量主要用于输出当前对象的信息,魔术函数则是对象的常用方法 相同点: 1.PHP超级 ...
- Python subplot 绘画
环境 Anaconda3 Python 3.6, Window 64bit 目的 利用 matplotlib 画图模块,汇至子图 # -*- coding: utf-8 -*- import matp ...