01-Trie - 解决异或问题的 Trie

Aak 的窝 / 2023-09-02 / 原文

前言

Trie 树就是所谓的字典树(前缀树),每个节点都是一个字母,用来解决单词匹配的问题。
而 01-Trie 是一种特殊的字典树,其中的节点的值都在 \({0, 1}\) 中。
01-Trie 可以用来解决一部分异或问题。

建树

向 01-Trie 中插入的是一个二进制数,根据题目的不同,可以从高位向低位插,也可以从低位向高位插。
现在我们从高位往低位插。
第一步我们需要把所有的数字的二进制位对齐。
比如我们要插入 1141411 的二进制是 10111411104100,我们就需要把 4 补为 0100
接下来就可以采取普通字符串插入普通 Trie 的方式插入了。最终的插入结果应该是这样的(红色是根,黑色是 \(1\),白色是 \(0\))。

维护异或极值

给你一个集合 \(A\),你需要从其中挑出两个数使他们的异或和最大。
乍一看可以使用线性基解决,实际上会发现线性基并不好做,线性基适合的类型是从集合中挑出任意多数求极值。
这个时候就需要使用 01-Trie 了。