字典树
字典树
字典树,英文名 trie。顾名思义,就是一个像字典一样的树。
可以发现,这棵字典树用边来代表字母,而从根结点到树上某一结点的路径就代表了一个字符串。
前缀树的3个基本性质:
- 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
- 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
- 每个节点的所有子节点包含的字符都不相同。
查的话就正常查,不过必须记住要是在叶子节点,不然也不算在
代码为:
1 | const int N = 1000050; |
trie[i] [x]=0,代表字典树中目前没有这个点
trie[i] [x]的值代表这个点下方连有的点的编号
例如:trie[i] [2]=9代表第i号点和的下方连有一个点‘c’,并且那个点的编号是9
cnt[N]: cnt[i]==0代表编号为i的点不是一个单词的结束点
cnt[i]!=0代表编号为i的点是一个单词的结束点。
cnt[i]不一定只为0或1,因为有可能多次输入了同一个单词。
trie[p] [x] 查找连着目标字母的节点的编号,如果目标节点存在,就把p更新成目标节点的编号(p = trie[p] [x])。
如果trie[p] [x] == 0,代表字典树中没有这个点,如果是查找就代表没有这个单词,查找失败。
而如果是插入函数,我们就用 ++id 来把这个点存进字典树。
我们在两个函数的最后用cnt[p]来涂红节点或返回节点值。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论