1、“Trie树” 作用:
- 高效地存储和查找字符串集合的数据结构。
2、“Trie树” 存储字符串的形式如下:
- 用 “0” 来表示 “根节点(root)”。
- 存入一个字符串时,会在字符串最后结尾的那个字符节点打上标记。比如:字符串 “abcd” 是以字符 “d” 结尾的,那么就在字符节点 “d” 打上标记。
具体例子理解
左边数组初始全是0
添加字符串`”abc“,
- 首先``p = 0`
p 指的是当前所遍历到的节点
index 指的是最后一个可用的节点 - 依次获取每个字符(首先获取字符
'a'
)映射的数字(0~25)
- 由于当前节点,并没有
'a'
这个节点指向的节点, 我们就需要新建一个节点,然后我们把++idx
填写到这个节点上,第一次是1
AcWing 835. Trie字符串统计
#include <iostream>using namespace std;const int N = 100010;int son[N][26], cnt[N], idx;
char str[N];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] ++;
}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];
}int main()
{int n;scanf("%d", &n);while(n --){char op[2];scanf("%s%s", op, str);if(op[0] == 'I') insert(str);else printf("%d\n", query(str));}return 0;
}