BZOJ4260 Codechef REBXOR【01字典树】

2024-01-20 14:38

本文主要是介绍BZOJ4260 Codechef REBXOR【01字典树】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4260: Codechef REBXOR

https://www.lydsy.com/JudgeOnline/problem.php?id=4260

时间限制: 10 Sec  内存限制: 256 MB

 

题目描述

 

输入

输入数据的第一行包含一个整数N,表示数组中的元素个数。

第二行包含N个整数A1,A2,…,AN。

 

输出

输出一行包含给定表达式可能的最大值。

 

样例输入

5
1 2 3 1 2

样例输出

6

提示

满足条件的(l1,r1,l2,r2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5)。

对于100%的数据,2 ≤ N ≤ 4*10^5,0 ≤ Ai ≤ 10^9。

思路

先说明几个数组的作用

a[]存放原数组

pre[]存放异或前缀

suf[]存放异或后缀

dp[i]存放前i个数中任意区间异或的最大值

 

求两个不相交的区间,两区间异或后的和最大,设第二个区间的左端点为m,则第一个区间在[1,m-1)内,第二个区间的左端点为m,右端点在[m,n]内,其中n表示数的个数,我们枚举m,即m取值为[2,n], 在m确定的情况下求最大的值,当两个数分别取最大时,它们的和最大,此时dp[]就排上用处了,在m确定的情况下,第一个区间的最大异或值为dp[m-1](即前m-1个数中任意区间异或的最大值)。

 

如何求以元素a[i]为结束元素的区间的异或最大值?由于异或操作有这么个性质

异或前缀: pre[i]^pre[j]=a[i+1]^a[i+2]^...^a[j] (i<j)

异或后缀:suf[i]^suf[j]=a[i]^a[i+1]^...^a[j-1] (i<j)

我们求以元素a[i]为结束元素的区间的异或最大值,使用异或前缀pre[],我们将per[0],pre[1],..,pre[i-1]插入到01字典树中,然后查找与a[i]以后后值最大的数即可。同理可使用异或后缀suf[] 求以元素a[i]为开始元素的区间的异或最大值。

 

通过上面的分析,这道问题就好解决了,先用pre[]和01字典树求出dp[],然后枚举第二个区间的左端点m,求第二个区间的异或最大值就是求以a[m]为开始元素的区间的异或最大值,使用01字典树即可。

C++代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>using namespace std;const int N=400500;int a[N],trie[32*N][2],dp[N],pre[N],suf[N];
int tot;//插入操作 
void insert(int x)
{int rt=0;for(int i=31;i>=0;i--){int c=(x>>i)&1;if(!trie[rt][c]) trie[rt][c]=++tot;rt=trie[rt][c];}
}//查询操作 
int query(int x)
{int rt=0,m=0;for(int i=31;i>=0;i--){int c=(x>>i)&1;if(trie[rt][c^1]){m=((c^1)<<i)|m;rt=trie[rt][c^1];}else{m=(c<<i)|m;rt=trie[rt][c];}}return m^x;
}int main()
{int n;while(~scanf("%d",&n)){memset(dp,0,sizeof(dp));memset(pre,0,sizeof(pre));memset(suf,0,sizeof(suf));memset(trie,0,sizeof(trie));tot=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]);//输入原数组 for(int i=1;i<=n;i++) pre[i]=a[i]^pre[i-1];//求前缀  for(int i=n;i>=1;i--) suf[i]=a[i]^suf[i+1];//求后缀//插入pre[0]即0,通过pre[]和01字典树求dp[] insert(0);for(int i=1;i<=n;i++){dp[i]=max(query(pre[i]),dp[i-1]);insert(pre[i]);} int ans=0;//初始化01字典树 tot=0;memset(trie,0,sizeof(trie));insert(0);for(int i=n;i>=1;i--){ans=max(ans,dp[i-1]+query(suf[i]));insert(suf[i]);}printf("%d\n",ans);}return 0;
} 

 

这篇关于BZOJ4260 Codechef REBXOR【01字典树】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/626336

相关文章

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

POJ2001字典树

给出n个单词,求出每个单词的非公共前缀,如果没有,则输出自己。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;

集中式版本控制与分布式版本控制——Git 学习笔记01

什么是版本控制 如果你用 Microsoft Word 写过东西,那你八成会有这样的经历: 想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样: 过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4