// 查询异或最大值,每次插入和查询时间都是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,维护异或最大值的更多相关文章

  1. BZOJ 4260: Codechef REBXOR (trie树维护异或最大值)

    题意 分析 将区间异或和转化为前缀异或和.那么[L,R][L,R][L,R]的异或和就等于presum[R] xor presum[L−1]presum[R]\ xor \ presum[L-1]pr ...

  2. 中南oj 1216: 异或最大值 数据结构

    1216: 异或最大值 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 98  Solved: 29 [Submit][Status][Web Boar ...

  3. POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】

    传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total S ...

  4. 2013级新生程序设计基础竞赛-正式赛 F 异或最大值 解题报告

    F - 异或最大值 Time Limit: 2000/1000MS (Java/Others)      Memory Limit: 128000/64000KB (Java/Others) Subm ...

  5. CSU 1216 异或最大值

    求n个数里面,求两两异或的最大值 直接来肯定会超时 既然要异或最大值,那么两个数的二进制肯定是正好错开为好...为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面 ...

  6. 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] ...

  7. CSU1216: 异或最大值(01Trie树)

    Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...

  8. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  9. Codeforces 811C Vladik and Memorable Trip (区间异或最大值) (线性DP)

    <题目链接> 题目大意: 给你n个数,现在让你选一些区间出来,对于每个区间中的每一种数,全部都只能出现在这个区间. 每个区间的价值为该区间不同的数的异或值之和,现在问你这n个数最大的价值是 ...

  10. [模拟赛]异或最大值 maxinum

    此题在考试时用暴力,暴了30分. 献上30分代码: #include<stdio.h> ]; int main() { int n,t,c,i,max,j,d; freopen(" ...

随机推荐

  1. MySQL百万级数据大分页查询优化的实现

    前言:在数据库开发过程中我们经常会使用分页,核心技术是使用用limit start, count分页语句进行数据的读取. 一.MySQL分页起点越大查询速度越慢 直接用limit start, cou ...

  2. 金仓数据库(kingbase)的system用户被锁的解锁步骤

    今天发现我安装的金仓数据库(kingbase)的system用户被锁了,无法登陆.百度搜了下,使用SUPERMANAGER_V8ADMIN可以解锁,试了下果然如此.解锁步骤如下: 用户:SUPERMA ...

  3. 使用python进行视频图片提取

    操作系统 : Windows 10 [版本 10.0.19043.1165] Python 版本 : 3.9.2_x64 可以借助python代码使用opencv实现,命令行示例代码如下: # pyt ...

  4. google三驾马车之一:Bigtable解读(英文版)

    本文重点关注了系统设计相关的内容,paper后半部分的具体应用此处没有过多涉及.从个人笔记修改而来,因此为英文版本. Bigtable: A Distributed Storage System fo ...

  5. 【简写MyBatis】01-简单映射器

    前言 新开一个坑,为了学习一下MyBatis的源码,写代码是次要的,主要为了吸收一下其中的思想和手法. 目的 关联对象接口和映射类的问题,把 DAO 接口使用代理类,包装映射操作. 知识点 动态代理 ...

  6. 使用 lspci 和 setpci 调试 PCIe 问题

    lspci 命令和 setpci 命令均为 Linux 发行版中原生可用的命令. 这 2 条命令均可提供多级输出,适合在不同时间点用于查看 PCI 总线上训练的不同组件的功能和状态.其中大部分功能均可 ...

  7. SAS (Statistics Analysis System) 统计分析系统软件

    SAS SAS (Statistical Analysis System) 是一个统计软件系统,由 SAS Institute 开发, 用于数据管理, 高级分析, 多元分析, 商业智能, 刑事调查和预 ...

  8. python基础语法知识

    1.多组输入没有结束标志的两种表示形式 #method1: try: while True: #代码 except EOFError: pass #method2: while True: try: ...

  9. win32 - 在cmd中禁用进程权限

    C:\Users\path>whoami /priv 在cmd中输入whoami /priv后将获得当前令牌(标准用户)的权限. C:\Users\path>tasklist /v /fo ...

  10. Jenkins下载插件报错

    只要看日志报了什么错 下载超时 更新代理源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 报unable ...