Trie树
Trie用于高效地存储和查找字符串集合的数据结构
比如字符串abcd, abce, ac, ba, bc
Trie的存储结构如下图所示,其中字符串结尾会有特殊标记
root
/ \
a b
/ \ / \
b c a c
/
c
/ \
d e
这里用二维数组实现trie树, 假设树中只有小写字母结点
1 int son[N][26];
二维数组son[ i ][ j ], i 表示父结点的索引,j 表示当前字母,比如son[300][a]表示父结点为300,当前结点为a的字符串
1 int idx;
idx表示索引,表示当前有多少种情况
1 int cnt[N];
cnt[ i ]表示索引为i的字符串出现情况
代码如下:
#include <iostream> using namespace std; const int N = 100010; int son[N][26], size, cnt[N]; int idx; 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; cin >> n; while(n--) { char temp[N]; char ch[2]; scanf("%s%s", ch, temp); if(*ch == 'I') insert(temp); else printf("%d\n", query(temp)); } }