【参考博客】:

LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

【题目链接】:

https://loj.ac/problem/10051

【题意】:

找出两个不相交区间的异或值相加。

【题解】:

这个题目还是挺有趣的,不是单纯地套模板了。

这个题目类似于 最大字段和问题。

首先我们可以预处理出所有的异或前缀和。

区间的异或值,就是两端点异或前缀和的异或值。

还需要处理出

L[t] = max{ Xor[i,j] }  1<= i,j <= t

R[t] = max{ Xor[i,j] }  t<= i,j <= n

分别代表两端点的异或最大值,
问题来了,怎么知道上面两个数组的值呢????
其实我们这里需要一点变通,我们其实求区间异或值,其实是两端点的异或前缀和。
如果我们把所有前缀和看成一些数,进行异或值最大化。不就回到最开始01字典树的应用吗???
不过我们还需要保留过程中的最大值。
即 L[i] = max{ L[i-1] , Insert_Xor(sum[i]) } 
可能插入了当前值,但还是达不到前面一点的最大值。所以需要处理一波。
上面的过程不久像极了最大字段和吗???
 
 
【代码】:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 4e5+;
const int M = 1e7+3e6; typedef long long ll;
int Son[M][];
int sum[N],Back[N];
int a[N],n,idx;
ll L[N],R[N]; void Insert(int x){
int p = ;
for(int i=;~i;i--){
int t = x >> i & ;
if( !Son[p][t] ) Son[p][t] = ++idx ;
p = Son[p][t];
}
} ll Query(int x){
int res = , p = ;
for(int i=;~i;i--){
int t = x >> i & ;
if( Son[p][t^] ){
res += <<i ;
p = Son[p][t^];
}else{
p = Son[p][t];
}
}
return res ;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]); Insert();
for(int i=;i<=n;i++){
sum[i] = sum[i-] ^ a[i];
Insert(sum[i]);
L[i] = max( L[i-] , Query(sum[i]) );
} memset( Son , , sizeof Son );
idx = ; Insert();
for(int i=n;i;i--){
sum[i] = sum[i+] ^ a[i];
Insert(sum[i]);
R[i] = max( R[i+] , Query(sum[i]) ) ;
} ll ans = ;
for(int i=;i<=n;i++){
ans = max( ans , L[i]+R[i+] ) ;
}
/*
for(int i=1;i<=n;i++){
printf("%d , %lld\n",i,L[i]);
}
for(int i=n;i;i--){
printf("%d , %lld\n",i,R[i]);
}
*/
printf("%lld\n",ans);
return ;
}
 

【Trie】Nikitosh 和异或的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. Nikitosh 和异或(trie树)

    题目: #10051. 「一本通 2.3 例 3」Nikitosh 和异或 解析: 首先我们知道一个性质\(x\oplus x=0\) 我们要求\[\bigoplus_{i = l}^ra_i\]的话 ...

  3. #10051 Nikitosh 和异或

    Nikitosh 和异或 其实题意已经简单的不能再简单了,所以就不讲了. 因为题目中 \(1\leq l_1 \leq r_1 <l_2 \leq r_2\leq N\),所以显然对于最终答案, ...

  4. Nikitosh 和异或 —— 一道 trie 树的题用可持久化 trie 水 然后翻车了...

    题意简介 题目就是叫你找两个不重合的非空区间,使得这两个区间里的数异或后相加的和最大 (看到异或,没错就决定是你了可持久化trie!) 思路 水一波字典树,莫名觉得这题可持久化能过,于是水了一发挂了, ...

  5. BZOJ4260,LOJ10051 Nikitosh 和异或

    题意 给定一个含 \(N\) 个元素的数组 \(A\),下标从 \(1\) 开始.请找出下面式子的最大值:\((A[l_1]\bigoplus A[l_1+1]\bigoplus -\bigoplus ...

  6. HDU 4825 Xor Sum (trie树处理异或)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  7. Educational Codeforces Round 12 E. Beautiful Subarrays trie求两异或值大于等于k对数

    E. Beautiful Subarrays   One day, ZS the Coder wrote down an array of integers a with elements a1,   ...

  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. Nikitosh 和异或

    题面 设 \(l_{i}\) 为以 \(i\) 为结尾的区间中最大的一段异或值,\(r_{i}\) 为以 \(i\) 为开头的区间中最大的一段异或值. 则有 \[l_{i}=\max\left(l[i ...

随机推荐

  1. 关于rsa公钥格式的处理,一行纯内容进行换行格式化

    最近在开发百度小程序,他的平台公钥是纯字符串,公钥的内容,没有rsa文件的头(-----BEGIN PUBLIC KEY-----)和尾部分-----END PUBLIC KEY----- 但是 PH ...

  2. Mysql 原理以及常见mysql 索引等

    ## 主键 超键 候选键 外键 (mysql数据库常见面试题) 数据库之互联网常用架构方案 数据库之互联网常用分库分表方案 分布式事务一致性解决方案 MySQL Explain详解 ## 数据库事务的 ...

  3. 冲刺阶段——Day1

    [成员分工及任务量] 成员 分工 任务量(小时) 王梓鸿 完成页面设计并编写输入输出图形界面,部分代码测试 20 童皓祯 编写注册和登录模块代码,部分代码测试 20 林郅聪 绘制燃尽图,程序功能整合及 ...

  4. Linux设备驱动程序 之 per-cpu变量

    数组形式 支持SMP的现代操作系统使用每个cpu上的数据,对于给定的处理器其数据是唯一的:一般来说,每个cpu的数据存放在一个数组中,数组总的每一项对应着系统上的一个存在的处理器:按当前处理器号确定这 ...

  5. suduku

    github地址 PSP: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 30 30 Estimate 估 ...

  6. 飞行姿态角度表示: heading pitch roll

    //创建初始化摄像机视图 var initialPosition=new Cesium.Cartesian3.fromDegrees(-73.998114468289017509, 40.674512 ...

  7. Unknown system variable 'query_cache_size'

    java连接mysql 报错 java.sql.SQLException: Unknown system variable 'query_cache_size'at com.mysql.cj.jdbc ...

  8. 从UDP的”连接性”说起–告知你不为人知的UDP

    原文地址:http://bbs.utest.qq.com/?p=631 很早就计划写篇关于UDP的文章,尽管UDP协议远没TCP协议那么庞大.复杂,但是,要想将UDP描述清楚,用好UDP却要比TCP难 ...

  9. 以太坊Geth通过私钥导入新地址到钱包步骤

    Open TextEdit Paste key into TextEdit without any extra characters or quotations Save the file as pk ...

  10. SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符

    ylbtech-SQL-W3School-高级:SQL UNION 和 UNION ALL 操作符 1.返回顶部 1. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT ...