字典树01字典树算法笔记
1】学习了字典树之后,觉得它很明显的就是用空间来换时间,空间复杂度特别大,比如字典数单单存26个小写字母,那么每个节点的孩子节点都有26个孩子节点,字典树中的每一层都保留着不同单词的相同字母。
2】01字典树主要用于解决求异或最值的问题
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map> #include<cctype> #include<stack> #include<sstream> #include<list> #include<assert.h> #include<bitset> #include<numeric> #define debug() puts("++++") #define gcd(a,b) __gcd(a,b) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define fi first #define se second #define pb push_back #define sqr(x) ((x)*(x)) #define ms(a,b) memset(a,b,sizeof(a)) #define sz size() #define be begin() #define mp make_pair #define pu push_up #define pd push_down #define cl clear() #define lowbit(x) -x&x #define all 1,n,1 #define rep(i,x,n) for(int i=(x); i<=(n); i++) #define in freopen("in.in","r",stdin) #define out freopen("out.out","w",stdout) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> P; const ULL base = 100000007;//33951943 const int INF = 0x3f3f3f3f; const LL LNF = 1e18; const int maxn = 1e5+20; const int maxm = 1e5 + 10; const double PI = acos(-1.0); const double eps = 1e-8; const int dx[] = {-1,1,0,0,1,1,-1,-1}; const int dy[] = {0,0,1,-1,1,-1,1,-1}; int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int ch[32*maxn][2]; //边的值 LL val[32*maxn]; //点的值 int id; //树中当前结点个数 void init() {ms(ch[0],0);id=1; } void Insert(LL x) //在字典树中插入x {int u=0;for(int i=32;i>=0;i--){//和一般的字典树的操作相同将x的二进制插入字典树中int c=((x>>i)&1); if(!ch[u][c]) //如果结点未被访问过 {ms(ch[id],0); //将当前结点的边值初始化val[id]=0; //结点值为0,表示到此不是一个数ch[u][c]=id++; //边指向的节点编号 }u=ch[u][c]; //下一结点 }val[u]=x; //最后的结点插入val,结点值为x,即到此是一个数 } LL Query(LL x) //在字典树中查找和x异或的最大的元素并返回值 {int u=0;for(int i=32;i>=0;i--){int c=(x>>i)&1;if(ch[u][c^1]) //利用贪心,优先寻找和当前位不同的数u=ch[u][c^1];elseu=ch[u][c];}return val[u]; //返回结果 } int main() {int n,m,t,ca=0;LL x;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=0;i<n;i++){scanf("%lld",&x);Insert(x);}printf("Case #%d:\n",++ca);while(m--){scanf("%lld",&x);printf("%lld\n",Query(x));}}return 0; } /* 【题意】在一组数中找跟某个数异或结果最大的数。【类型】01字典树【分析】直接套用模板,将数组中的数插入到 01字典树,对每一个数查询即可。【时间复杂度&&优化】【trick】【数据】 */
HDU 4185
1. 01字典树是一棵最多 32层的二叉树,其每个节点的两条边分别表示二进制的某一位的值为 0 还是为 1. 将某个路径上边的值连起来就得到一个二进制串。
2.节点个数为 1 的层(最高层)节点的边对应着二进制串的最高位。
3.以上代码中,ch[i] 表示一个节点,ch[i][0] 和 ch[i][1] 表示节点的两条边指向的节点,val[i] 表示节点的值。
4.每个节点主要有 4个属性:节点值、节点编号、两条边指向的下一节点的编号。
5.节点值 val为 0时表示到当前节点为止不能形成一个数,否则 val[i]=数值。
6.节点编号在程序运行时生成,无规律。
7.可通过贪心的策略来寻找与 x异或结果最大的数,即优先找和 x二进制的未处理的最高位值不同的边对应的点,这样保证结果最大。
例题:
一、HDU 4825
传送门:HDU 4825
题目大意:在一组数中找跟某个数异或结果最大的数。
题解:直接套用模板,将数组中的数插入到 01字典树,对每一个数查询即可。
二、HDU 5536
传送门:HDU 5536
题目大意:在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。
题解:HDU 5536 题解
三、BZOJ 4260
传送门:BZOJ 4260
题目大意:给你 n 个数,让你求两个不相交的区间元素异或后的和的最大值。
题解:BZOJ 4260 题解
四、POJ 3764
传送门:POJ 3764
题目大意:在树上找一段路径(连续)使得边权相异或的结果最大。
题解:POJ 3764 题解
转载于:https://www.cnblogs.com/Roni-i/p/9449592.html
字典树01字典树算法笔记相关推荐
- 字典树-01字典树基础
字典树-01字典树 什么是字典树? 字典树,又叫前缀树,Trie树,通常被用作字符串匹配. 它的实现原理是什么? 先建立一颗树,对于这棵树上每个节点i与其后继节点间的连线,都有存入一个字符. 对于存图 ...
- 字典树 01字典树【数据结构】
题目1:字典树 HDU 1251 统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以 ...
- 字典树01字典树专题对字典树的理解
对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...
- 字典树 01 字典树基础
Trie - 字典树 字典树这种数据结构最典型的用例就是存单词: 相较于普通的树结构O(logn)的时间复杂度,其时间复杂度为O(w),w为单词的长度: 基础代码 Trie中的节点Node是不存储字符 ...
- Educational Codeforces Round 23:E. Choosing The Commander(字典树01异或)
Educational Codeforces Round 23:E. Choosing The Commander(字典树01异或) 题意: 3种操作: 1 插入一个数 2 删除一个数 3 给出一个数 ...
- 【字典树】字典树的创建(入门详细介绍)
Part one[何谓字典树] 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. ...
- hust1350Trie【字典树+dfs || 字典树 + LCA】
大意:告诉你一些字符串 让你组成字典树, 然后定义每个节点到所有叶子节点的距离的和等于改点的value 当根节点只有一个孩子,该根节点也算一个叶子节点 问所有节点的value的最小值 分析: 开始做的 ...
- 字典树基础知识学习笔记
节点最多有N个时,开一个二维数组son[N][M](M为所有字符的总个数),记录每个点的儿子.对每一个字符串的结尾的序号,用cnt[N] 数组来记录有多少个这样的字符串,这张图可以帮助理解: 假设给定 ...
- python 实现字典树_python字典树(Trie)的实现
class TrieNode: def __init__(self): self.nodes = dict() self.cnt = 0 self.length = 0 self.is_leaf = ...
最新文章
- 使用Python+OpenCV+detectorn2实现社交距离检测
- ubuntu 11.04下Android开发环境的搭建!
- 大概率有料的地方,大概率没有料的地方
- 云计算背后的秘密(3)-BigTable
- 清除浮动的方法总结CSS实现水平垂直居中方法总结
- 的使用_面部精华使用方法和使用步骤;
- 【Vue案例一】实现跑马灯效果
- Hadoop入门基础教程 Hadoop之完全分布式环境搭建
- 华为鸿蒙系统刷屏,到底什么是微内核操作系统呢?
- linux定时备份Mysql
- ORACLE_mldn_002
- PNG生成多尺寸ico文件,开发桌面应用必备
- 什么是SAP PCo
- C++计算md5/sha1/sha256/sha384/sha512算法
- 关于十七届恩智浦杯安徽赛区基础组参赛分享
- [转载]菜鸟的草缸 篇一:器材篇(附鱼缸、过滤器、灯、草泥开箱过程)
- 翁凯java程序设计总结(基于C语言基础上)
- 计算机连接电视显示超范围,HDMI连接后电脑操作界面的边框超出电视屏幕,怎么解决...
- python winform开发框架_winform引用网络上的图
- 计算机组成课设sbb,计算机组成原理课设(完成版).doc
热门文章
- PMP在国内的含金量
- 一个java应用程序必须且只有一个类含有什么方法_JAVA简答题!!!
- Putty Fatal Error:Network error connection refued
- 谁有战神世界页游源码!!!
- 如何禁用U盘、屏蔽USB端口(两种方法)
- 使用selenium爬取淘宝实战.md
- openbmc开发28:fru配置和测试
- 2020-12-11 PMP 群内练习题 - 光环
- 大唐豪侠服务器列表文件格式错误,关于大唐豪侠一键端的一些问题心得
- The Definitive Guide to Firebase 免积分下载