题目传送门

分析:首次考虑暴力枚举 \(l_{1},r_{1},l_{2},r_{2}\),配合前缀和时间复杂度 \(O(N^{4})\),需要想办法优化。对于这种两段区间不重合的,我们考虑枚举两段区间之间的断点,设 \(max\_{l}[x]\)表示由区间 \([1,x]\)所能得到的区间异或最大值, \(max\_{r}[x]\)表示由区间 \([x,n]\)所能得到的区间异或最大值,那么答案即为 \(\max(max\_l[i]+max\_r[i+1])(i \in [1,n))\)。现在要想办法计算 \(max\_l\)和 \(max\_r\),考虑更新 \(max\_{l}[x]\),不难得出 \(max\_{l}[x] = \max(max\_l[x-1], \max(a_{i} \oplus a_{i+1} \oplus... \oplus a_{x})(i \in [1,x]))\), \(\max(a_{i} \oplus a_{i+1} \oplus... \oplus a_{x})(i \in [1,x])\)通过 \(Trie\)树和异或前缀和即可求出,不会的话可以看下这道题。然后就可以 \(O(N)\)求解了。

#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 4e5 + 5; struct Trie{
int root, id;
bool bit[32]; struct Node{
int val, siz, ch[2];
Node(){ ch[0] = ch[1] = -1, val = siz = 0; }
}node[N * 32]; void get(int x){
for(int i = 0; i < 32; ++i, x >>= 1) bit[i] = x & 1;
} void init(){
for(int i = 0; i <= id; ++i){
node[i].ch[0] = node[i].ch[1] = -1;
node[i].val = node[i].siz = 0;
}
id = root = 0;
} void insert(int x){
get(x);
int u = root;
for(int i = 31; i >= 0; --i){
if(node[u].ch[bit[i]] == -1) node[u].ch[bit[i]] = ++id;
u = node[u].ch[bit[i]];
++node[u].siz;
}
node[u].val = x;
} int find(int x){ // 返回与x异或最大的数
get(x);
int u = root;
for(int i = 31; i >= 0; --i){
int s1 = node[u].ch[!bit[i]], s2 = node[u].ch[bit[i]];
if(s1 != -1 && node[s1].siz > 0) u = s1;
else if(s2 != -1 && node[s2].siz > 0) u = s2;
else return x; // 注意根据需要调整返回值
}
return node[u].val;
}
}trie; int n, ans;
int a[N], max_l[N], max_r[N], p[N]; void work(){
int Xor = 0;
trie.insert(0);
for(int i = 1; i <= n; ++i){
Xor ^= a[i];
p[i] = max(p[i - 1], trie.find(Xor) ^ Xor);
trie.insert(Xor);
}
} int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
work();
for(int i = 1; i <= n; ++i) max_l[i] = p[i];
for(int l = 1, r = n; l < r; ++l, --r) swap(a[l], a[r]);
trie.init();
work();
for(int i = n; i; --i) max_r[i] = p[n - i + 1];
for(int i = 1; i < n; ++i) ans = max(ans, max_l[i] + max_r[i + 1]);
printf("%d", ans);
return 0;
}

[Codechef REBXOR]Nikitosh and xor (Trie,异或)的更多相关文章

  1. 【BZOJ】4260: Codechef REBXOR【Trie树】【前后缀异或最大】

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2218  Solved: 962[Submit][Stat ...

  2. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  3. BZOJ 4260: Codechef REBXOR( trie )

    求出前缀和, 那么以第x个元素结尾的最大异或值是max(sumx^sump)(1≤p<x), 用trie加速. 后缀同理, 然后扫一遍就OK了.时间复杂度O(31N) ------------- ...

  4. 【BZOJ4260】Codechef REBXOR (Trie树)

    [BZOJ4260]Codechef REBXOR (Trie树) 题面 BZOJ 题解 两眼题.第一眼不会做,第二眼好简单... 前缀异或和一下,拿\(Trie\)树维护求一个在这个端点以左的最大值 ...

  5. 【BZOJ4260】Codechef REBXOR Trie树+贪心

    [BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output ...

  6. [Bzoj4260]Codechef REBXOR(trie树)

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1534  Solved: 669[Submit][Stat ...

  7. bzoj 4260: Codechef REBXOR (01 Trie)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4260 题面: 4260: Codechef REBXOR Time Limit: 10 S ...

  8. BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)

    题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...

  9. BZOJ 4260 Codechef REBXOR (区间异或和最值) (01字典树+DP)

    <题目链接> 题目大意:给定一个序列,现在求出两段不相交的区间异或和的最大值. 解题分析: 区间异或问题首先想到01字典树.利用前缀.后缀建树,并且利用异或的性质,相同的两个数异或变成0, ...

  10. [BZOJ4260]Codechef REBXOR(Trie)

    Trie模板题.求出每个前缀和后缀的最大异或和区间,枚举断点就可.不知为何跑得飞快. #include<cstdio> #include<cstring> #include&l ...

随机推荐

  1. [nginx]lua读取请求体

    前言 nginx默认不读取请求体的数据,但可以通过$request_body内置变量来获取.$request_body存在内存中,如果它的字节大小超过nginx配置的client_body_buffe ...

  2. XAML格式化工具:XAML Styler

    XAML格式化的意义 在开发WPF应用过程中,编写XAML时需要手动去缩进或者换行,随着时间的推移或者参与开发的人增多,XAML文件内容的格式会越来越乱.要么属性全都写在一行,内容太宽一屏无法完整展现 ...

  3. 【Unity3D】调整屏幕亮度、饱和度、对比度

    1 屏幕后处理流程 ​ 调整屏幕亮度.饱和度.对比度,需要使用到屏幕后处理技术.因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度.饱和度.对比度的实现. ​ 本文完整资源见→Unity3D调整屏幕 ...

  4. 重学JavaScript Promise API

    在这篇教程中,我们将掌握如何在JavaScript中创建并使用Promise.我们将了解Promise链式调用.错误处理以及最近添加到语言中的一些Promise静态方法. 什么是Promise? 在J ...

  5. SRC赏金猎人—笔记一

    以下是我如何将 webshell 上传到一个旧目标中, 这是使用谷歌dorks,Js检查和文件上传过滤器绕过. 过程 1.我随机选择了一个范围很大的目标开始 2.我启动了自动化脚本来发现使用的技术.d ...

  6. Spring HandlerInterceptor工作机制

    本文以一个通过正常注册拦截器流程注册拦截器失败的实际场景,来带领大家阅读源码,体会Spring的HandlerInterceptor拦截器整个工作流程 简单认识 org.springframework ...

  7. SpringBoot 启动流程追踪(第二篇)

    上一篇文章分析了除 refresh 方法外的流程,并着重分析了 load 方法,这篇文章就主要分析 refresh 方法,可以说 refresh 方法是 springboot 启动流程最重要的一环,没 ...

  8. Codeforces 1257D - Yet Another Monster Killing Problem

    题意: 有\(n\)个怪物,每个怪物有攻击力\(a_i\)点:有\(m\)个英雄,每个英雄有攻击力\(p_i\)点,耐力\(s_{i}\)点. 怪物需要被依次杀死(按输入顺序). 每一天可以挑选一个英 ...

  9. KRPANO资源分析工具下载720YUN全景图

    提示:目前分析工具中的全景图下载功能将被极速全景图下载大师替代,相比分析工具,极速全景图下载大师支持更多的网站(包括各类KRPano全景网站,和百度街景) 详细可以查看如下的链接: 极速全景图下载大师 ...

  10. 小知识:vi 查找如何不区分大小写

    在使用vi查找数据库的truncate记录日志时,发现对应语句夹杂了大小写,不够规范: 而vi默认查找是区分大小写的,如何不区分大小写查找指定内容呢? 有两种方式: (1)在查找指令后面额外加上\c标 ...