Trie树的作用
高效存储的查找字符串
图片来自ACwing(算法学习网) 文中左边是输入的数据 右边是建好的树
void insert(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++ ;
}
trie树的插入代码
p表示的是层数 for (int i = 0; str[i]; i ++ ) 遍历每一个字符 int u = str[i] - ‘a’; 将字符转换成数字 当作数组下标处理
if (!son[p][u]) son[p][u] = ++ idx;
///idx表示的是用到了哪个位置 以免数组重复使用
如果数组son[p][u] 没有用过 那么就令son[p][u] = ++idx 表示用过了
如果当前位置已经存在了字符也就是son[p][u] == true
那么我们只需要继续往下一层遍历就行 p = son[p][u]
因为这个模板是统计字符出现的次数 所以cnt[p]++ 打了个记数标记
trie树查询出现次数
int query(char *str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}
如同插入一样 都是直接遍历 如果! son[p][u]表示并没有这个字符串出现过 如果能找到最后一层那么直接返回前面打的标记就行
字符串统计题目传送门 练手的洛谷水题