【函数式Trie】51NOD 1295 XOR key

通道

思路:每个数建个31位的树,处理好关系即可

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 60007;
const int BIT = 32;

int n, m;
int tot, s[N * BIT], a[N * BIT][2], root[N];

void Insert(int x, int &y, int num, int d) {
    s[y = ++tot] = s[x] + 1;
    if (d < 0) return ;
    int dig = num >> d & 1;
    a[y][dig ^ 1] = a[x][dig ^ 1];
    Insert(a[x][dig], a[y][dig], num, d - 1);
}
int Query(int x, int y, int num, int d) {
    if (d < 0) return 0;
    int dig = num >> d & 1;
    if (s[a[y][dig ^ 1]] - s[a[x][dig ^ 1]])
        return (1<<d) + Query(a[x][dig ^ 1], a[y][dig ^ 1], num, d - 1);
    return Query(a[x][dig], a[y][dig], num, d - 1);
}

template <class T>
inline bool rd(T &ret) {
    char c; int sgn;
    if(c = getchar() , c == EOF) return false;
    while(c != ‘-‘ && (c < ‘0‘ || c > ‘9‘)) c = getchar();
    sgn = (c == ‘-‘) ? -1 : 1;
    ret = (c == ‘-‘) ? 0 : (c - ‘0‘);
    while(c = getchar(), c >= ‘0‘ && c <= ‘9‘) ret = ret * 10 + (c - ‘0‘);
    ret *= sgn;
    return true;
}
template <class T>
inline void pt(T x) {
    if (x < 0) {
        putchar(‘-‘);
        x = -x;
    }
    if(x > 9) pt(x / 10);
    putchar(x % 10 + ‘0‘);
}

int main() {
    rd(n), rd(m);
    Insert(root[0], root[1], 0, 31);
    for (int i = 1; i <= n; ++i) {
        int v; rd(v);
        Insert(root[i], root[i + 1], v, 31);
    }
    while (m--) {
        int v, l, r; rd(v), rd(l), rd(r); ++l, ++r;
        pt(Query(root[l], root[r + 1], v, 31)), putchar(‘\n‘);
    }
    return 0;
}

时间: 2024-10-08 09:57:43

【函数式Trie】51NOD 1295 XOR key的相关文章

[51nod 1295]Xor key(可持久化trie)

[51nod 1295]Xor key(可持久化trie) 题面 给出一个长度为n的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少? 分析 可持久化trie裸题 代码 #include<iostream> #include<cstdio> #define maxb 31 #define maxn 200000 #define maxs 6

51nod 1295 XOR key (可持久化Trie树)

1295 XOR key  题目来源: HackerRank 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] 至 A[R] 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少? Input 第1行:2个数N, Q中间用空格分隔,分别表示数组的长度及查询的数量(1 <= N <= 50000, 1 <= 

函数式trie思想 &amp; Bzoj 3261 &amp; 3166 题解

[原题1] 3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 497  Solved: 215 [Submit][Status] Description 给定一个非负整数序列 {a},初始长度为 N. 有   M个操作,有以下两种操作类型: 1 .A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2 .Q l r x:询问操作,你需要找到一个位置 p,满足 l<=p<=r,使得: a[p] xor a[

51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值是多少?Input第1行:2个数N, Q中间用空格分隔,分别表示数组的长度及查询的数量(1 <= N <= 50000, 1 <= Q <= 50000). 第2 - N+1行:每行1个数,对应数组A的元素(0 <= Aii <= 10^9). 第N+2 - N+Q+1行:

HackerRank - &quot;XOR key&quot;

New techniques learnt: Trie can be used for some XOR problems. The basic idea: we build a MSB->LSB prefix Trie of all numbers; then query greedily: find an existing XOR-diff bit at each target bit index. I found a clean and easy-to-understand code on

【Trie】The XOR Largest Pair

[题目链接] https://loj.ac/problem/10050 [题意] 给出n个数,其中取出两个数来,让其异或值最大. [题解] 经典的01字典树问题. 首先需要把01字典树建出来. 然后对于每一个串都跑一遍.如果存在当前位 不同的 节点,就往那里跑,否则顺着跑. 一切尽在代码中. [代码] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10;

[Luogu P4735]最大异或和(可持久化Trie)

[Luogu P4735]最大异或和(可持久化Trie) 题面 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类型: 1.Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1. 2.Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少. 分析 维护\(sum[i]=sum[i-1] \ \text{XOR} \ a[i]\),那么答案就是\(sum[

leetcode ----Trie专题

一:Implement Trie (Prefix Tree) 题目: Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs are consist of lowercase letters a-z. 分析:此题是典型的trie树,可以参见:http://blog.csdn.net/lu597203933/article/details/44227431

java实现的Trie树数据结构

最近在学习的时候,经常看到使用Trie树数据结构来解决问题,比如" 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词." 该如何解决? 有一种方案就是使用Trie树加 排序实现 . 什么是Trie 树呢?也就是常说的字典树,网上对此讲得也很多,简单补充一下个人理解: 它实际上相当于把单词的公共部分给拎出来,这样一层一层往上拎直到得到每个节点都是不可分的最小单元! 比如网上一个例子 一组单词,inn, int, at, a