【参考博客】:

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. input上传mp3格式文件,预览并且获取时间

    <input type="file" id="file" name="file" class="upfile" o ...

  2. keepalived+mysql双主热备

    这里使用keepalived实现mysql的双主热备高可用 实验环境: 主机名 IP 系统版本 软件版本 master 192.168.199.6/vip:192.168.199.111 Rhel7. ...

  3. UVALive 3716 DNA Regions ——(式子变形)

    一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...

  4. nltk data 离线安装

    运行程序时发现如下错误: 在命令行下载速度太慢,因此需要离线安装: 按照:http://www.nltk.org/data.html 中manual installation的方法, 将包下载好后解压 ...

  5. unigui图形验证码

    unigui图形验证码 procedure TMainForm.UniButton1Click(Sender: TObject); var url: SockString; serial: TynSe ...

  6. 模型压缩-ThiNet

    转载:https://blog.csdn.net/u014380165/article/details/77763037 https://www.twblogs.net/a/5b8d02472b717 ...

  7. org/springframework/cache/jcache/config/AbstractJCacheConfiguration.class

    在使用Spring-MVC环境时  报错: Failed to parse configuration class [org.springframework.cache.aspectj.AspectJ ...

  8. JAVA 基础编程练习题35 【程序 35 最大最小交换】

    35 [程序 35 最大最小交换] 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组. package cskaoyan; public class cskaoyan35 { ...

  9. EasyUI之toolTip

    <a class="easyui-tooltip" title="提示框" href="http://www.baidu.com"&g ...

  10. 【c++基础】二进制格式输出char类型

    前言 使用CAN通信时将信号转换为char类型进行传输,要查看传输的信息是否正确需要将char类型数据以二进制格式输出: code #include <iostream> int main ...