[模板]01trie,维护异或最大值
// 查询异或最大值,每次插入和查询时间都是log(C)
template<class T>
class trie01 {
vector<vector<T>> tree;
public:
trie01() : tree(1, vector<T>(2, 0)) {}
// 插入待检查的数字
void insert (T x)
{
int p = 0;
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][o] == 0)
{
tree[p][o] = tree.size();
tree.emplace_back(2,0);
}
p = tree[p][o];
}
}
// 查询在插入的数字中,返回与x异或后的最大值
T match (T x)
{
T t = x, p = 0;
// 从高位到低位
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][!o])
p = tree[p][!o], t = t|((T)1<<i);
else if(tree[p][o])
p = tree[p][o], t = t&(~((T)1<<i));
}
return t;
}
};
已通过 [数组中两个数的最大异或值](421. 数组中两个数的最大异或值 - 力扣(Leetcode))
template<class T>
class trie01 {
vector<vector<T>> tree;
public:
trie01() : tree(1, vector<T>(2, 0)) {}
void insert (T x)
{
int p = 0;
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][o] == 0)
{
tree[p][o] = tree.size();
tree.emplace_back(2,0);
}
p = tree[p][o];
}
}
T match (T x)
{
T t = x, p = 0;
// 从高位到低位
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][!o])
p = tree[p][!o], t = t|((T)1<<i);
else if(tree[p][o])
p = tree[p][o], t = t&(~((T)1<<i));
}
return t;
}
};
class Solution {
public:
int findMaximumXOR(vector<int>& nums) {
trie01<int> trie;
trie.insert(nums[0]);
int res = 0;
for(auto &a : nums)
res = max(res, trie.match(a)), trie.insert(a);
return res;
}
};
已通过 [E. Sausage Maximization](Problem - 282E - Codeforces)
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
template<class T>
class trie01 {
vector<vector<T>> tree;
public:
trie01() : tree(1, vector<T>(2, 0)) {}
void insert (T x)
{
int p = 0;
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][o] == 0)
{
tree[p][o] = tree.size();
tree.emplace_back(2,0);
}
p = tree[p][o];
}
}
T match (T x)
{
T t = x, p = 0;
// 从高位到低位
for(int i = sizeof(x)*8-2; i >= 0; --i)
{
bool o = (x&((T)1<<i));
if(tree[p][!o])
p = tree[p][!o], t = t|((T)1<<i);
else if(tree[p][o])
p = tree[p][o], t = t&(~((T)1<<i));
}
return t;
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
trie01<ll> trie;
int n; cin>>n;
vector<ll> arr(n);
ll sum = 0, res = 0;
for(auto &a : arr) {
cin >> a;
sum ^= a;
res = max(res, a);
trie.insert(sum);
}
sum = 0;
for(int i = n-1; i >= 0; --i)
{
sum ^= arr[i];
res = max(res, trie.match(sum));
}
cout << res << endl;
return 0;
}
[模板]01trie,维护异或最大值的更多相关文章
- BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)
题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...
- 中南oj 1216: 异或最大值 数据结构
1216: 异或最大值 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 98 Solved: 29 [Submit][Status][Web Boar ...
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...
- 2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告
F - 异或最大值 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Subm ...
- CSU 1216 异或最大值
求n个数里面,求两两异或的最大值 直接来肯定会超时 既然要异或最大值,那么两个数的二进制肯定是正好错开为好...为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面 ...
- 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key 2 秒 262,144 KB 160 分 6 级题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...
- CSU1216: 异或最大值(01Trie树)
Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...
- Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5646 Accepted: 1226 Description In an ...
- Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)
<题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...
- [模拟赛]异或最大值 maxinum
此题在考试时用暴力,暴了30分. 献上30分代码: #include<stdio.h> ]; int main() { int n,t,c,i,max,j,d; freopen(" ...
随机推荐
- P4093 [HEOI2016/TJOI2016] 序列 题解
题目链接:序列 对于 LIS 问题,很显而易见的有 dp方程为: \[dp_i=\max{dp_j}+1 \ (j<i,a_j \le a_i) \text{ dp表示以某个位置结尾的最长 LI ...
- Vulkan学习苦旅04:创建设备(逻辑设备VkDevice)
设备是对物理设备的一种抽象,使我们更加方便地使用它.更准确地说,应该称其为"逻辑设备",但由于逻辑设备在Vulkan中极为常用,后面几乎所有的API都需要它作为第一个参数,因此在V ...
- typescript json 转 bean
3个文件: 1.UserInfoGetResponse.ts class UserInfoGetResponse{ private userId: number; private userName: ...
- Power BI 10 DAY
Power BI 上下文 筛选上下文只管筛选,行上下文只管迭代,两者互不干涉,各司其职 计算列操作会自动创建行上下文 度量值不会自动创建行上下文,需要人为使用迭代函数进行行上下文的创建 (迭代函数本身 ...
- STM32F407VET6烧录出现flash download failed target dll has been cancelled
今天在通过stlink烧录一个长时间未用的STM32F407VET6 Black Board的时候, 出现错误 Internal command error Flash download failed ...
- tensorflow中交叉熵损失函数详解
1 前言 tensorflow中定义了3个交叉熵损失函数: softmax_cross_entropy_with_logits(logits, labels) softmax_cross_entrop ...
- centos 安装nacos 并以后台服务形式启动
一.下载解压nacos tar -xvf nacos-server-1.2.0.tar.gz 二.持久化配置(mysql) 修改nacos/conf/application.properties文件, ...
- 使用UTL_HTTP包获取网页内容
UTL_HTTP 包提供了容易的方式通过HTTP协议获取网页内容,下面结合几个例子介绍一下: ----------------------------------------------------- ...
- html+css:小米顶部菜单+二级菜单
1.源码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- win32 - 使用GDI+播放gif图片
今天做case的时候遇到一个这样的问题,故记录下来. Codeproject有类似的案例,不过是使用的MFC模板编译的. 因为我们只需要win32程序,所以就....代码如下: CodeProject ...