【学习笔记】【模板】【自学】Tire 字典树

发布时间 2023-09-10 17:59:53作者: CSP_AK_zyz

字典树:将每个字符串 $s$ 记录在 $\text{Trie}$ 上,使得所有 $s$ 都能在 $\text{Trie}$ 上找到。

- $\text{change}[i]$:字符 $i$ 在变为数字是的编号。

- $\text{Next}[i][j]$: 字符 $j$ 在树的第 $i$ 层的下一个访问节点。

- $\text{Trie}[i]$:当前节点编号为 $i$ 的字符出现次数。

建树:若在树的第 $i$ 层没有找到 $s_i$,就另开一个节点 $s_i$,记录 $\text{Next}$,一直寻找。

```cpp
void insert(string s) {
int pointer=0;
for(int i=0;i<s.size();i++) {
if(!next_node[pointer][change[s[i]]]) {
next_node[pointer][change[s[i]]]=++sum;
}
pointer=next_node[pointer][change[s[i]]],Trie[pointer]++;
}
return;
}
```

访问:在找前缀的时候直接往父亲节点遍历,若图中没有找到 $\text{Next}$,则返回,否则遍历后答案为 $\text{Trie}$。

```cpp
int ans(string s) {
int pointer=0;
for(int i=0;i<s.size();i++) {
if(!next_node[pointer][change[s[i]]]) return 0;
pointer=next_node[pointer][change[s[i]]];
}
return Trie[pointer];
}
```
$\text{Tips:}$ 由于时间限制,清空时请 $\text{Next}$ 数组中的 $i$ 循环到 $\text{sum}$ 就足够了,因为其他没有用,$\text{Trie}$ 同理。