#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 ...
随机推荐
- Feedforward neural networks前馈神经网络
Feedforward neural networks or deep feedforward networks or multilayer perceptrons Pass input throug ...
- Pipelines
https://blog.csdn.net/buracag_mc/article/details/100155599 ML Pipelines提供了一组基于DataFrame构建的统一的高级API,可 ...
- 再解决不了前端加密我就吃shi
参考文章 快速定位前端加密方法 渗透测试-前端加密测试 前言 最近学习挖洞以来,碰到数据做了加密基本上也就放弃了.但是发现越来越多的网站都开始做前端加密了,不论是金融行业还是其他.所以趁此机会来捣鼓一 ...
- 借助C++探究素数的分布
这里使用的区间是36,144,576,2304,9216,36864,147456,589824,2359296,9437184.至于这个区间是怎么得到的,感兴趣的同鞋可前往(https://www. ...
- [Angular JS教程] HeroService: getHeroes failed: undefined 问题解决方法
最近在学习入门Angular JS,学习资源是https://angular.cn/tutorial, 在学习到 "https://angular.cn/tutorial/toh-pt6模拟 ...
- 简单区间dp
题目链接 对于基本区间dp,设dp[l][r]是区间l到r的最大价值. 我们可以枚举区间的长度,在枚举左端点,判断即可. 当右端点大于n,就break. dp[l][r]=max(dp[l+1][r] ...
- Linux Centos7 安装Docker-CE
先确保yum 是最新版本 执行: sudo yum update 添加docker源地址 sudo yum-config-manager --add-repo https://download.doc ...
- github 如何解决error: failed to push some refs
错误 error: failed to push some refs to 'https://github.com/whitclass/scrapy-spider.git' hint: Updates ...
- go init执行顺序
package test import "fmt" // 初始化函数 引入包的时候要先执行 可以重复定义多个 同一个go文件从上到下 多个文件 是按照字符串进行排序 从小到大 执行 ...
- fastdfs之同一台storage server下包含多个store path
一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...