tire 字典树
先来个模板
什么是字典树呢?
就是存字典的树嘛,差不多的赶脚。
确实是将所有字符存入其中,方便查找(多是查找前缀)。怎么存捏?如下图
建树
差不多是这个意思,但并非是把所有字符的空间给开出来,这就要讲到如何建树了。
void insert()
{
int root = 0;
for (int i = 0; str[i]; i ++)
{
int s = str[i] - 'a';
if(!son[root][s]) son[root][s] = ++ idx;
root = son[root][s];
}
cnt[root]++;
}
root 节点设为0。son{ root }{ s }表示root这个节点上的s的编号idx。倘若这个点没有被创建,那就 son{ root }{ s } = ++ idx; 感觉这个 root 有并查集那味儿。存储他儿子的编号,便于查找。这时候就有读者要问,这个cnt{ N }是干嘛用的呢?答案是记录以这个点为结尾的数量。在搜前缀时,不一定只有一个字符从这里结束,所以要记录一下数量。
搜索
int search()
{
int root = 0, res = 0;
for