Trie树练习题

T1 「一本通 2.3 例 2」The XOR Largest Pair

在给定的 \(N\) 个整数\(A_1,A_2,...A_N\)中选出两个进行异或运算,得到的结果最大是多少?

数据范围

对于 100%的数据,\(1 \leq N \leq 10^5,0 \leq A_i \leq 2^{31}\)

1.朴素算法并用二分查去匹配二进制下每个数最高位的0还是能卡过的

2.结合异或的运算规则,怎样才能使两个数的异或和尽量大呢?答案是尽量让二进制下每一位都不同,如果对于每个数x,能直接找到某一位和它不同的数,那就可以贪心选取二进制下尽量不一样的数了。那怎么找呢?

3.结合数据范围发现每个数写成二进制最多才31位,每一位01两个状态。所以对每个数的二进制建trie树(深度越浅代表的二进制位越高,树的size最大为\(N*31\) ),对于每个数,在trie树上每走一步就贪心地选当前位和它不一样的数

  • 为什么这样贪一定使对的呢?假设当前数的第k位是0,trie树上的第k位存在1,那要么选这个1,则对结果有\(2^k\)的贡献;要么不选1选0,则后面的数位总共对结果最多有\(2^k-1\)的贡献,故第k位选相反数一定使更优的。算法正确性得证。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
const int N=1e5+5,M=20;
int n,num=0,mx=-1,z,a[N*M],ch[N*M][2],val[N*M];
inline void insert(int x){
int p=0;
G(i,30,0){
z=x&(1<<i)?1:0;
if(!ch[p][z]) ch[p][z]=++num;
p=ch[p][z];
} val[p]=x;
}
inline void qry(int x){
int p=0;
G(i,30,0){
z=x&(1<<i)?1:0;
if(ch[p][1^z]) p=ch[p][1^z];
else if(ch[p][z]) p=ch[p][z];
}
mx=max(mx,x^val[p]);
}
int main(){
scanf("%d",&n);
F(i,1,n) scanf("%d",&a[i]),insert(a[i]);
F(i,1,n) qry(a[i]);
printf("%d",mx);
return 0;
}

T2「一本通 2.3 练习 5」The XOR-longest Path

给定一棵 \(N\) 个点的带权树,求树上最长的异或和路径

  • 写在前面:审题一定要审清楚!没有指定\(1\)是根,“路径”的意思也不是说一定路径从根节点出发

(不然直接dfs这题不就秒了么)

1.暴力:分别以每个点为根跑根到每个点的异或和,最后取max,时间复杂度\(O(N^2)\),大概能过40分

2.Trie树优化:第一感觉一定是这道题和上面那道题很像,但关键是上题只需两两匹配,容易构建trie树,这道题要选很多条边权出来匹配,想了很久都不知道怎么建trie树。

考虑转化问题

(1)先任选一个点为根比如1,sum[i]表示根到所有点的路径异或和,这个可以一次dfs搞定

(2)接下来要利用一个很NB的性质(其实主要是我以前没见过doge):x ^ x=0,自己过程中还发现一个性质,顺带提一下吧虽然用不上:x^y=z z^y=x(有点像加减法)

(3)这个性质有什么用呢?学了LCA都知道树上任意两点的路径可以转化为 x 到 lca 的路径和 lca 的 y 的路径拼起来

(4)如果这道题询问的是路径上边权的代数和最大,那我们肯定求个lca就做完了。那异或和呢?

(5)考虑把sum[x]和sum[y]展开

展开即每一条边权来异或,由于异或有交换律,发现1到p(即lca(x,y))的边权会和自己异或,于是乎全部都变成了0,只剩下x到p,p到y的边权异或和,这恰恰就是我们想要的,甚至不用求lca

所以路径异或和又转换成了sum数组两两之间异或和的最大值,即T1所求。复杂度\(O(31N)\)

END~

Trie树练习题的更多相关文章

  1. 【字符串算法】字典树(Trie树)

    什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...

  2. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  3. 基于trie树的具有联想功能的文本编辑器

    之前的软件设计与开发实践课程中,自己构思的大作业题目.做的具有核心功能,但是还欠缺边边角角的小功能和持久化数据结构,先放出来,有机会一点点改.github:https://github.com/chu ...

  4. hihocoder-1014 Trie树

    hihocoder 1014 : Trie树 link: https://hihocoder.com/problemset/problem/1014 题意: 实现Trie树,实现对单词的快速统计. # ...

  5. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  6. 通过trie树实现单词自动补全

    /** * 实现单词补全功能 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #incl ...

  7. #1014 Trie树

    本题主要是求构造一棵Trie树,即词典树用于统计单词. C#代码如下: using System; using System.Collections.Generic; using System.Lin ...

  8. Trie树-字典查找

    描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...

  9. Trie树的创建、插入、查询的实现

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...

  10. Trie树(c++实现)

    转:http://www.cnblogs.com/kaituorensheng/p/3602155.html http://blog.csdn.net/insistgogo/article/detai ...

随机推荐

  1. Ynoi2016镜中的昆虫

    [Ynoi 2016] 镜中的昆虫 简化题意 给定长为 \(n\) 序列 \(a\) , 两种操作 \(m\) 次: 1 l r x : 将 \([l , r]\) 修改为 \(x\) 2 l r : ...

  2. 初三年后集训测试---T1排序

    初三年后集训测试 $T 1 $ 排序 $$HZOI$$ ·题意: 给定 \(4n\) 个整数,求 : \[\max\{\sum_{i=1}^{4n}(A_{i,1} \times A_{i,2} - ...

  3. B 端产品未来几年的发展趋势

    在当今数字化高速发展的时代,B 端产品经理作为企业数字化转型的关键推动者,肩负着重大的责任.不仅要深入了解企业的业务需求,还要紧跟技术发展的步伐,为企业提供高效.创新的解决方案.那么,未来几年,B 端 ...

  4. mysql bit(1) 字段insert 报错 Data too long

    insert数据时,给bit(1)字段赋值 '1' 报错 将字符串'1',修改为数字1即可

  5. maven 网关应用:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848,

    网关应用运行忽然报错:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848, 虽然调整了代码逻辑,但是n ...

  6. Canvas简历编辑器-Monorepo+Rspack工程实践

    Canvas简历编辑器-Monorepo+Rspack工程实践 在之前我们围绕Canvas聊了很多代码设计层面的东西,在这里我们聊一下工程实践.在之前的文中我也提到过,因为是本着学习的态度以及对技术的 ...

  7. SQL通用语法与分类

    通用语法 1.SQL可以单行或多行书写,以分号结尾. 2.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写. 3.注释 1)单行注释: -- 注释内容  或 # 注释内容(MySQL特有) ...

  8. Windows安装winget

    打开GitHub链接地址:https://github.com/microsoft/winget-cli/releases 选择最新版本,点进去后 找到名为后缀名为 ".msixbundle ...

  9. 获取sql语句

    1.$model->_sql(); 方法实际执行的就是 $model->getLastSql(); 2.fetchSql fetchSql用于直接返回SQL而不是执行查询,适用于任何的CU ...

  10. Linux内核源码阅读:AArch64的异常处理机制详谈(内核版本6.11)

    ​ 任何玩过Arm64架构的朋友都知道,我们的ARM64架构有异常:Exception Levels, ELs,它是其异常处理机制的核心组成部分,允许系统在不同的特权级别下执行代码.ARM64定义了四 ...