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. Blazor开发框架Known-V2.0.8

    V2.0.8 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行.目前已有部分客户在使用,最近客户的项目和产品,有的在Docker中运行,有的在重新升级改造 ...

  2. AutoMaper使用

    使用 AutoMapper 进行赋值 一. 什么是 AutoMapper AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 二. Aut ...

  3. 在 Windows 中启用 Administrator 帐户

    打开管理员终端. 启用: net user administrator /active:yes 关闭: net user administrator /active:no

  4. Ruby 学习笔记

    基本语法 变量 name = "Alice" age = 30 puts "Name: #{name}, Age: #{age}" var # 局部变量 @va ...

  5. el-form 自定义验证规则,手动触发某项验证

    1. ui <el-form ref="xXXForm" :rules="XXXFormRules" > <el-form-item labe ...

  6. .net 环境使用 RabbitMQ ,由浅入深 【一】

    最近因为先开发的项目需要用到消息队列,因此捣鼓了一下市面上开源的消息队列. 原本听闻Rocketmq ,一开始用的是 RocketMQ,各种集群搭建完毕,消息发送什么的测试后,,但是结果因为 Rock ...

  7. 技术教程 —— 如何利用 SEI 实现音画同步?

    ​  摘要:利用 SEI 解决数据流录制回放过程中的音画不同步问题. 文|即构 Web SDK 开发团队 今年 6 月, ZEGO 即构科技推出了行业内首套数据流录制 PaaS 方案,打破传统录制服务 ...

  8. 前端微服务qiankun 2.x主子应用通信代码片段

    主应用代码 主应用工程里面源代码新建qiankun/index.js,通信代码如下: import { initGlobalState } from "qiankun"; impo ...

  9. MoCov1: 无监督视觉表征学习的动量对比《Momentum Contrast for Unsupervised Visual Representation Learning》(MoCo、动量对比、动态字典、队列维护、对比损失InfoNCE)

    现在是2024年6月11日,21:49,刚找好要看的论文,师兄推荐的. 先占个坑,明天看,我累了(我没脑子了). 现在是6月12日,15:49,干正事了(又被别人影响了情绪,这不好,希望你改掉,好的, ...

  10. C# – delegate, event, EventHandler

    前言 写这么多年 C#, 我从来没有写过 EventHandler. 我想应该是因为我没有用 C# 开发过前端的关系, 绝对不是我技术不行哦. 这篇就补上一个学习笔记呗. 参考 C#知识点讲解之C#d ...