bzoj 4260: Codechef REBXOR(01字典树)
4260: Codechef REBXOR
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 1281 Solved: 560
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
设q[i]为前i个数的最大区间异或和,p[i]为后n-i+1个数的最大区间异或和
答案就是max(q[i]+p[i+1])
这样问题就转化了
令F[l, r] = a[l]^a[l+1]^…^a[r]
那么F[l, r] = F[0, r]^F[0, l-1],也就是两个前缀异或和相异或
用字典树维护一下前缀异或和和后缀异或和就行
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct Trie
{Trie *next[2];
}Trie;
int a[400005], sum[400005], q[400005], p[400005];
void Update(Trie *root, int x)
{int i, now;Trie *p = root;for(i=30;i>=0;i--){now = 0;if(x&(1<<i))now = 1;if(p->next[now]==NULL){Trie *temp = new Trie;temp->next[0] = temp->next[1] = NULL;p->next[now] = temp;}p = p->next[now];}
}
int Query(Trie *root, int x)
{int i, now, ans = 0;Trie *p = root;for(i=30;i>=0;i--){now = 1;if(x&(1<<i))now = 0;if(p->next[now]!=NULL){ans += (1<<i);p = p->next[now];}else if(p->next[now^1]!=NULL)p = p->next[now^1];elsereturn ans;}return ans;
}
void Delete(Trie *root)
{int i;for(i=0;i<=1;i++){if(root->next[i]!=NULL)Delete(root->next[i]);}free(root);
}
int main(void)
{int n, i;LL ans = 0;Trie *root = new Trie;scanf("%d", &n);for(i=1;i<=n;i++){scanf("%d", &a[i]);sum[i] = sum[i-1]^a[i];}root->next[0] = root->next[1] = NULL;Update(root, 0);for(i=1;i<=n;i++){q[i] = max(Query(root, a[i]), q[i-1]);Update(root, a[i]);}free(root);root = new Trie;root->next[0] = root->next[1] = NULL;Update(root, 0);for(i=n;i>=1;i--){p[i] = max(Query(root, a[i]), p[i]);Update(root, a[i]);}for(i=1;i<=n-1;i++)ans = max(ans, (LL)q[i]+p[i+1]);printf("%lld\n", ans);free(root);return 0;
}
/*
2
1 2
*/
bzoj 4260: Codechef REBXOR(01字典树)相关推荐
- bzoj 4260: Codechef REBXOR
Description Solution 记录前缀答案和后缀答案,然后枚举断点合并即可 求出以每一个结尾的最大异或的段,相当于求两个前缀异或值的最大值,用trie树贪心即可 #include<b ...
- Codechef REBXOR[dp+字典树]
解题思路:1.区间异或和可以搞前缀[or后缀]异或,xori=lra=pre[l]⊕pre[r]xor_{i=l}^{r}a=pre[l]\oplus pre[r]xori=lra=pre[l]⊕p ...
- Codechef REBXOR HYSBZ - 4260(01字典树+区间异或最大)
Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,-,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 ...
- [Bzoj4260]Codechef REBXOR(trie树)
4260: Codechef REBXOR Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1534 Solved: 669 [Submit][St ...
- hdu5296 01字典树
根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...
- Beautiful Subarrays (01字典树 瞎搞)
题意: 题解: 一看问的是子序列,并且还是异或. 首先想到01字典树,再一看让你求子序列的个数,大致是想让你把这个序列进行前缀异或处理后然后再01字典树上进行操作吧. 假设01字典树往左边是0右边是1 ...
- 奶牛异或(01字典树)
题意: 让你找一个连续区间异或和最大,如果有相同的,则输出断点较小的. 题解: 01字典树,利用前缀和的思想进行求解,我们在插入前缀的同时,也在不断的更新最大值. 我们查询当前 二进制字符串与已经插入 ...
- hdu-4825(01字典树)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- zcmu-1783(01字典树)
1783: 秋实大哥与快餐店 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 78 Solved: 12 [Submit][Status][Web B ...
最新文章
- WTForms 小计1 forms
- 华为2018届校招技术岗笔试题及个人解答
- exit(0)什么意思php,php – 文件中的exit(1)导致脚本状态码为0
- 【译】A quick list of new enterprise features in iOS 13, iPadOS, and macOS 10.15 Catalina
- 10万量级30秒自动化配座,0现场故障:这届冬奥票务系统有点不一样
- Parallels Desktop 16 升级 macOS Big Sur 无法联网解决方法
- RabbitMq(一)走进RabbitMq
- 计算机雕刻教学设计,综合实践《果蔬雕刻》教学设计第一课时
- 车牌识别的matlab程序(程序_讲解_模板),车牌识别的matlab程序(程序-讲解-模板)资料...
- nas网络存储_网络附加存储NAS
- ubuntu 挂载U盘 NTFS
- 云电脑有显卡吗?云电脑怎么做画面处理?
- 前端框架 — Bootstrap
- ValueError: y contains previously unseen labels: ‘103125‘
- “创新驱动的结构化思维”培训
- SIPM模拟器 MIPS汇编语言实现读取文件
- mac如何用移动随E行连接有线网络(中国计量大学)
- scrollTo()方法
- 心理学和计算机科学的联系,人工智能和心理学有什么关系?
- Lazy and Hungry
热门文章
- python画三维图-Python+matplotlib绘制三维图形5个精选案例
- 2018年python工作好找吗-2018年 Python面试必看的10个问题及答案
- python能做什么工作-学Python能找到什么工作?这4种工作最热门!
- 深度学习笔记 | 第16讲:语音识别——一份简短的技术综述
- 语音识别错误太多?高科技巨头们偏偏“不信邪”
- 什么是pdi检测_汽车pdi检测是什么?如何知道新车做没做pdi
- 订单失效怎么做的_虾皮Shopee新加坡电商做什么产品好呢?订单少得可怜怎么办呢...
- webpack跨域问题记录
- Vue 新手引导标签
- SpringCloud--GateWay搭建及路由转发规则介绍