#10051 Nikitosh 和异或
其实题意已经简单的不能再简单了,所以就不讲了。
因为题目中 \(1\leq l_1 \leq r_1 <l_2 \leq r_2\leq N\),所以显然对于最终答案,总有一个 \(x\) 满足 \(r_1\leq x<l_2\)。
那么就可以不断尝试以那个点为 \(x\),来求出答案,具体方法如下:
设 \(l_i=max_{1\leq l \leq r\leq i}\{a_l\bigoplus a_{l+1}\bigoplus..\bigoplus a_r\}\),\(r_i=max_{i\leq l\leq r\leq N}\{a_l\bigoplus a_{l+1}\bigoplus..\bigoplus a_r\}\)。
那么 \(ans=max_{1\leq i<N}\{l_i+r_{i+1}\}\),而关键在于怎么求 \(l_i,r_i\)。
这里引入一个概念:异或前缀和,即 \(S_i=a_0\bigoplus a_1\bigoplus a_2\bigoplus...\bigoplus a_i\)。(其中 \(a_0=0\))
那么 \(l_i=max_{1\leq j< i}\{S_i\bigoplus S_j\}\),\(r_i=max_{i< j\leq N}\{S'_i\bigoplus S'_j\}\)。(其中 \(S'_i=a_N\bigoplus a_{N-1}\bigoplus...\bigoplus a_i\))
然后就是简单的 trie 贪心求最大异或对了,但是还有几处细节要注意,都写在代码里了。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define N 9000010
using namespace std;
int n, trie[N][2], l[N], r[N], a[N], tot = 0;
int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') f = (c == '-') ? -1 : 1, c = getchar();
while (c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
void insert(int x) {
int p = 0;
for (int i = 31; i >= 0; i--) {
int ch = (x >> i) & 1;
if (!trie[p][ch])
trie[p][ch] = ++tot;
p = trie[p][ch];
}
return;
}//简单的模板式的插入。
int search(int x) {
int p = 0, ans = 0;
for (int i = 31; i >= 0; i--) {
int ch = (x >> i) & 1;
if (trie[p][ch ^ 1]) {
ans |= (1 << i);
p = trie[p][ch ^ 1];
} else
p = trie[p][ch];
}
return ans;
}
//简单的模板式的查询。
int main() {
n = read();
int s = 0;
insert(s);
for (int i = 1; i <= n; i++) {
a[i] = read();
s ^= a[i];//当前的异或前缀和。
insert(s);
l[i] = max(l[i - 1], search(s));//一定要取 max。
}
memset(trie, 0, sizeof(trie));
tot = 0;//记得清零。
insert(s);
for (int i = n; i >= 1; i--) {
s ^= a[i];
insert(s);
r[i] = max(r[i + 1], search(s));//同上。
}
int ans = 0;
for (int i = 1; i < n; i++) ans = max(ans, l[i] + r[i + 1]);
printf("%d\n", ans);
return 0;
}
#10051 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 [题意]: 找出两个不相交区 ...
- Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...
题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...
- BZOJ4260,LOJ10051 Nikitosh 和异或
题意 给定一个含 \(N\) 个元素的数组 \(A\),下标从 \(1\) 开始.请找出下面式子的最大值:\((A[l_1]\bigoplus A[l_1+1]\bigoplus -\bigoplus ...
- 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 ...
随机推荐
- Java知识系统回顾整理01基础03变量04类型转换
一.不同类型之间的数据可以互相转换,但是要满足一定的规则 二.数据类型转换规则 转换规则如图所示 精度高的数据类型就像容量大的杯子,可以放更大的数据 精度低的数据类型就像容量小的杯子,只能放更小的数 ...
- STM32之旅3——时钟数
STM32之旅3--时钟数 STM32F1是M3内核,它的时钟数很庞大,让一个初学者去看,估计会很吃力,和我们入门的8051单片机的时钟不同,这里又倍频.又分频,而且还分成好多个时钟,不同的外设时钟不 ...
- Oracle 数据库创建表空间、创建用户
创建表空间 create temporary tablespace user_name_temp tempfile '/oradata/ORA11G/user_name_temp.dbf' size ...
- 使用Spring Boot创建docker image
目录 简介 传统做法和它的缺点 使用Buildpacks Layered Jars 自定义Layer 简介 在很久很久以前,我们是怎么创建Spring Boot的docker image呢?最最通用的 ...
- day31 Pyhton 总结
# 什么是封装? # 广义上(大家认为的) : # 把一类事务的相同的行为和属性归到一个类中 # class Dog: # def bite(self):pass ...
- JS关闭chorme页面
百度到的很多答案都失效了,这是收集一位博主的(https://www.jianshu.com/p/9dc2752194b8),目前可以使用. 代价是打开一个空白页面,能实现无提示关闭当前页面.不需要是 ...
- Martyr2项目实现——Number部分的问题求解 (1) Find Pi to Nth Digit
Martyr2项目实现--Number部分的问题求解 (1) Find Pi to Nth Digit Find Pi to Nth Digit 问题描述: Find PI to the Nth Di ...
- git学习(二) git的文件状态
git的文件状态 用于查看git的状态 git status 用于git文件的删除操作 git rm 如果只是 git rm --cache 仅删除暂存区里的文件: 如果不加--cache 会删除工作 ...
- 集合与map
- 自定义Jackson2HttpMessageConverter,适应.html后缀url
Jackson2HttpMessageConverter 用处 SpringMVC中,controller中的方法返回java Bean对象,mvc将此对象转换成字符串 默认支持的mediaType: ...