字典树小结
最近复习了一下字典树,就顺带总结下字典树的版子,以及常见的使用方法吧
版子
字典树版子
1 | //这种写法过于正式看着让人很不舒服,具体题目时可以自己做简化,怎么简单怎么来 |
字典树介绍
字典树,顾名思义和字典类似,使用字典查找单词时,当然是先找到第一个字母的范围,然后根据后续的字母依次缩小范围,字典树的插入查询就是这个过程,在插入过程中如果找不到当前字母的后续就给它开辟一个节点来存储
字典树的特点,非常典型的空间换时间,从字典树的版子可以看出,字典树的空间复杂度极高,但是时间复杂度让人很满意
字典树的几个例题
01字典树
一种特殊的字典树,用来处理异或相关的问题,例如找最大异或和
异或:二级制不进位加法,(1,0)/(0,1)异或得1,(1,1)/(0,0)异或得0,异或的两个数相同的值为0,不同则为1
找两个数的最大异或和其实就是找到一个尽可能和一个数和当前数互补,所以我们从高位开始找,尽可能的找与当前位相反的数,在不济也是找到自己
两个数最大异或和 ac代码
1 |
|
这里要用到前缀异或和,由于异或的特点,当两个相同的数字异或时,得到的结果会是0,如果是用前缀异或和sum的话,sum[i - 1] ^ sum[j]就相当于是a[i]连续异或到a[j],从而优化了时间复杂度,同时将这个问题简化到求两个数的最大异或和问题了
要注意的一点是,这里是i和j是可以相等的,也就是说是可以得到自身的,所以要先插入一个0
连续最大异或和 ac代码
1 |
|
普通字典树
这个题的坑点在于,一个单词可能是另一个单词的前缀
L语言 ac代码
1 |
|