#10051. 「一本通 2.3 例 3」Nikitosh 和异或 字典树

2023-10-18 15:32

本文主要是介绍#10051. 「一本通 2.3 例 3」Nikitosh 和异或 字典树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给定一个含 个元素的数组 ,下标从 开始。请找出下面式子的最大值:,其中, 表示 和 的按位异或。

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

第二行包含 个整数 。

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

样例
样例输入
5
1 2 3 1 2
样例输出
6

题目是 求两端不相邻的异或区间最大的和

求区间异或值,其实是两端点的异或前缀和
x⊕x=0
所以 从l到r的异或相当于(从1到l)和(1到r)的异或
然后我们可以定义一个sum数组来储存前缀的异或和,区间[l,r]的值为sum[r]⊕sum[l-1],把sum中的值看成一些数,就相当于The XOR Largest Pair这道题
再定义一个ans数组,我们用lans表示从左往右到第i位时的区间最大异或和。
lans[i]=max(lans[i+1],query(sum[i])
rans表示从右往左到第i位时的区间最大异或和。
rans[i]=max(rans[i-1],query(sum[i])
ans=max{ans,lans[i]+rans[i+1]}

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int maxn = 400005;
int tree[maxn*32][2], tot;
void join(int x)
{int u=0,i;for(i=31;i>=0;i--){int c=(x>>i)&1;if(!tree[u][c])tree[u][c]=++tot;u=tree[u][c];}
}
int query(int x)
{int u=0,ans=0,i,c,o;for(i=31;i>=0;i--){c=(x>>i)&1;o=c^1;if(!tree[u][o]){ans<<=1;u=tree[u][c];}elseans=(ans<<1|1),u=tree[u][o];}return ans;
}
void init()
{memset(tree,0,sizeof(tree));tot = 0;
}
int a[maxn],lsum[maxn],rsum[maxn];
int lans[maxn],rans[maxn];
int main()
{int n;scanf("%d",&n);for(int i =1; i<=n; i++){scanf("%d",&a[i]);lsum[i] = lsum[i-1]^a[i];}for(int i = n; i>=1; i--) rsum[i] = rsum[i+1]^a[i];for(int i = n; i>=0; i--){lans[i] = max(query(lsum[i]),lans[i+1]);join(lsum[i]);}init();for(int i = 1; i<=n+1; i++){rans[i] = max(query(rsum[i]),rans[i-1]);join(rsum[i]);}ll ans = 0;for(int i = 0; i<=n; i++){ans = max(ans,(ll)lans[i] + rans[i+1]);}printf("%lld\n",ans);return 0;
}

这篇关于#10051. 「一本通 2.3 例 3」Nikitosh 和异或 字典树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

POJ2001字典树

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

2.3多任务编程示例1

1.CUBEMAX配置  2.CODE void StartTask1(void const * argument){/* USER CODE BEGIN StartTask1 */TickType_t pxPreviousWakeTime=xTaskGetTickCount();/* Infinite loop */for(;;){LED1_Turn();// vTaskDelay

python 实现第k个字典排列算法

第k个字典排列算法介绍 "第k个字典排列"算法通常指的是在给定的字符集合(例如,字符串中的字符)中,找到所有可能排列的第k个排列。这个问题可以通过多种方法解决,但一个常见且高效的方法是使用“下一个排列”算法的变种,或称为“第k个排列”的直接算法。 方法一:使用“下一个排列”的变种 生成所有排列:首先生成所有排列,但显然这种方法对于较大的输入集合是不切实际的,因为它涉及到大量的计算和存储。 排序

POJ3617(字典序最小问题)

书中43页 此题有坑点,PE了40分钟.也是醉了....题目要求每80个字符才换行,而且最后一个如果恰好就不用换,这不是无聊嘛....... #include <iostream>#include <cstdio>#include <cstring>using namespace std;int n,m;char S[2100],P[2100];int main(){#ifd

POJ 2001 Shortest Prefixes(字典树入门)

题目: http://poj.org/problem?id=2001 题意: 找到多个字符串中,各自唯一的最短子串,例如 carte 与 carce 各自唯一的最短子串为cart与carc,即不会与其它字符串的子串重复。 思路: 字典树 解题心得: 更新关键值的时机很重要 代码: #include<stdio.h>#include<string>typedef str

【OpenCV2.2】图像的算术与位运算(图像的加法运算、图像的减法运算、图像的融合)、OpenCV的位运算(非操作、与运算、或和异或)

1 图像的算术运算 1.1 图像的加法运算 1.2 图像的减法运算 1.3 图像的融合 2 OpenCV的位运算 2.1 非操作 2.2 与运算 2.3 或和异或 1 图像的算术运算 1.1 图像的加法运算 add opencv使用add来执行图像的加法运算 图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的. # 图片加法imp

用异或交换两个整数的陷阱

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面: void exchange(int &a, int &b) {     a ^= b;     b ^= a;     a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱。 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]),

Oracle数据库(数据字典、表空间、表的创建、视图)

知识点引用: http://www.2cto.com/database/201207/142874.html http://blog.csdn.net/haiross/article/details/11772847 一. 彻底卸载Oracle 方式1、重装操作系统 方式2、 2.1 DBCA删除数据库开始 → 程序 → Oracle → 开发与移植工具 → Datab

Python的字符串,list,tuple,set,字典操作详解

1.字符串python是要创建成字符串的元素,其中的每个字母都是单一的子串,把它放在' '单引号或是'' ''引号中,就完成了python 字符串的创建。#str强制转换>>> a=123>>> b=str(a) #将整数转化为字符串>>> b'123'>>> a=[1,2,3]>>> b=str(a) #将list转化为字符串>>> b'[1, 2, 3]'#字符串下

【简历】25届南京某一本JAVA简历:简历通过率还好,但是拿不到OFFER

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天看一份25届南京某一本大学的Java简历。 这个简历呢,学校是一本。我们说上来先要定校招层次,这个层次就按照中厂来讲。因为现在很多的双非一本目标都是在中厂。 这个同学有个实习经历,一本有八成的同学主项目都是重复的。HR他只能看到项目重不重复,要点对不对他不知道,就从这个角度来看,这位同学