[模板]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(" ...
随机推荐
- 服了,一个ThreadLocal被问出了花
分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 地铁上,小帅无力地倚靠着杆子,脑子里尽是刚才面试官的夺命连环问,"用过TheadLocal么?Thr ...
- 基于BiLSTM-CRF模型的分词、词性标注、信息抽取任务的详解,侧重模型推导细化以及LAC分词实践
基于BiLSTM-CRF模型的分词.词性标注.信息抽取任务的详解,侧重模型推导细化以及LAC分词实践 1.GRU简介 GRU(Gate Recurrent Unit)门控循环单元,是[循环神经网络]( ...
- Linux-MySQL导入示例数据库employees
1. 下载employees示例数据库employees是一个官方提供的简单数据库,在mysql的官方找到employees的说明页面,通过github下载该数据库. https://github.c ...
- CF383C Propagating tree
题目链接 题目 见链接. 题解 知识点:DFS序,树状数组. 我们需要对子树的不同奇偶层加减,用dfn序可以解决子树问题,但是并不能直接分奇偶. 一种比较麻烦的思路是,将dfn序分成两个序列,一个是偶 ...
- 【framework】AMS启动流程
1 前言 AMS 即 ActivityManagerService,负责 Activy.Service.Broadcast.ContentProvider 四大组件的生命周期管理.本文主要介绍 A ...
- Spring异步任务async介绍与案例实战
关于spring异步任务 简单地说,用@Async注释bean的方法将使其在单独的线程中执行.换句话说,调用者不会等待被调用方法的完成.利用spring提供的注解即可简单轻松的实现异步任务处理. 默认 ...
- 解决putty连接报 connection refused
Ubuntu中换个速度快点的源后 执行 $sudo apt-get install openssh-server 安装ssh协议 执行ifconfig显示Ubuntu的ip地址 xp中用putty输入 ...
- spring boot和redis实现自定义前后分离token认证
说明:文章部分代码引用自github 本项目地址:https://gitee.com/indexman/redis-token-demo 1.token认证流程 此处以前端页面请求后端用户列表接口为例 ...
- 使用base标签解决Thymeleaf页面获取项目路径问题
问题说明 写博客页面在发表博客后我想跳转到博客详情页.这里面我用到了:window.location.href="localhost:8080/post/detail/123"; ...
- python列表操作的大O效率