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 ...
随机推荐
- Linux 上下左右键变成^A,^B,^C,^D解决方法
用gedit打开 /etc/vim/vimrc.tiny,将里面的 set compatible 改成 set nocompatible 对于退格键backspace的问题,只需在刚才那句话下面加上一 ...
- jQuery UI 自定义样式的日历控件
在线演示 本地下载
- Ubuntu 14.04上架IPSec+L2TP的方法
最简单的方法是使用脚本一步一步地进行配置.我用的是philplckthun写的脚本,修改了一下获取服务器IP的方法:脚本文件. 在ubuntu下运行: sh setup.sh 配置配置完成后,服务器端 ...
- ES6中Json、String、Map、Object之间的转换
/** *字符串转json * */ static stringToJson(data){ return JSON.parse(data); } /** *json转字符串 */ static jso ...
- ELK分布式日志收集搭建和使用
大型系统分布式日志采集系统ELK全框架 SpringBootSecurity1.传统系统日志收集的问题2.Logstash操作工作原理3.分布式日志收集ELK原理4.Elasticsearch+Log ...
- 端口被sysmtem占用
今天启动Apache的时候老是提示失败,很简单,使用 netstat -ano 发现80端口被占用.如图所示:
- linux ioctl()函数
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. ...
- LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses
问题描述:求括号字符串中最长合法子串长度.例如:()((),返回2,而不是4. 算法分析:还是利用栈,和判断合法括号对是一样的. public static int longestValidParen ...
- scala学习手记18 - Any和Nothing
Any 前面已经有两次提到过:在scala中,Any类是所有类的超类. Any有两个子类:AnyVal和AnyRef.对应Java直接类型的scala封装类,如Int.Double等,AnyVal是它 ...
- python标准日志模块logging使用
python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: ...