Trie树

  字典树(Trie)是一个比较简单的数据结构,也叫前缀树,用来存储和查询字符串。例如:aa, aba, ba, caaa, cab, cba, cc可以用下图的方式来进行存储。
Trie树
可以发现,这棵字典树用边来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。举个例子,14812表示的就是字符串 caa
  以此题为例最大异或对。建树的代码如下:

int idx, son[3000010][2], cnt[100010]; int n, a[100010]; void Insert(int x) { int p = 0; for (int i = 30; ~i; i -- ) { int s = x >> i & 1; if (!son[p][s]) son[p][s] = ++ idx; p = son[p][s]; } } int query(int x) { int p = 0, res = 0; for (int i = 30; ~i; i -- ) { int s = x >> i & 1; if (son[p][!s]) p = son[p][!s], res += 1 << i; else p = son[p][s]; } return res; }

trie树要明确两个问题:
  son[N][x]是什么, idx是什么?
  首先son[N][x]这是个二维数组。
  第一维N是题目给的数据范围,像在trie树当中N需要自己计算,最大为N26(其实根本达不到这么大,举个简单的例子假设用0和1编码,按照前面的计算最大的方法应该是4乘2=8但其实只有6个结点)。
  第二维x代表着儿子结点的可能性有多少,在本题中下一位只有0或者1两种情况所以为2。
而这个二维数组本身存的是当前结点的下标,就是N喽,所以总结的话son[N][x]存的就是第N的结点的x儿子的下标是多少,然后idx就是第一个可以用的下标。


__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16163586.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示