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内核优化项
net.ipv4.ip_forward = #该文件内容为0,表示禁止数据包转发,1表示允许 net.ipv4.conf.default.rp_filter = #是否忽略arp请求 net.ipv4 ...
- Windows Server 2008 R2服务器遗忘管理员密码解决方案
A goal is a dream with a deadline. Much effort, much prosperity. 在日常的工作中,对于一个网络管理员来讲最悲哀的事情莫过于在没有备用 ...
- [洛谷3041]视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- Mybatis映射配置文件<select>的学习
resultMap的使用 当查询的表的列名与实体类的属性名不同时,有三种方式来处理: 1.使用SQL的别名 如:select user_name userName from user 2.如果符合驼峰 ...
- ActiveMQ 实现消息接收发送
一.接收者 package com.demo.initservice; import javax.jms.Connection; import javax.jms.ConnectionFactory; ...
- Mac下编译tesseract报错 DotProductAVX can't be used on Android
因为我的mac是64位的,所以用32位编译,执行的时候肯定会出错的. 所以应该在 arch/simddetect.cpp中把这句# define X86_BUILD 1 注释掉,就可以了. 参考 ht ...
- filebeat配置介绍
Filebeat Prospector filebeat.prospectors: - input_type: log paths: - /var/log/apache/httpd-*.log doc ...
- MQ 个人小结
在PCS项目: talking 发送队列1.1 创建@Beanpublic Queue orderTakingQueue() { return createQueue(orderTakingQueue ...
- Hibernate -- 映射多对多双向关联关系
1. 示例代码: Student.java package cn.itcast.many2many; import java.util.HashSet; import java.util.Set; @ ...
- throws和throw的用法例子以及检测和非检查异常
throws E1,E2,E3 只是告诉程序这个方法可能会抛出这些个异常,方法的调用者可能要处理这些异常.而这些异常E1,E2,E3可能是该函数体产生的. 而throw是明确之处这个地方要抛出这个异常 ...