Trie
2018-02-19 21:57
148 查看
简介
操作
小性质
insert操作
CODE
询问
CODE
练手题
我们可以先构建一颗这样的树 ( 画风诡异,见谅:
2、有相同前缀的单词公用前缀节点,那我们可以的得出每个节点最多有26个子节点(在单词只包含小写字母的情况下)
3、整棵树的根节点是空的。便于插入和查找
其实大家应该清楚了。
1.如果是查询某个单词的话,我们用bool变量 v[i]表示节点i是否是单词结束的标志。
2、如果是查询前缀出现的次数的话,那就在开一个sum[],表示位置i被访问过的次数,
那么最后return的是sum[root]
这里前缀的次数是标记在前缀的最后一个字母所在位置的后一个位置上。
操作
小性质
insert操作
CODE
询问
CODE
练手题
简介
其实就是一颗树,好多题目是26叉树操作
如果我们有字符串 calcal,catcat,appapp,aplyaply,hhhh;我们可以先构建一颗这样的树 ( 画风诡异,见谅:
小性质
1、字典树用边表示字母2、有相同前缀的单词公用前缀节点,那我们可以的得出每个节点最多有26个子节点(在单词只包含小写字母的情况下)
3、整棵树的根节点是空的。便于插入和查找
insert操作
我们设数组node[i][j]=knode[i][j]=k,表示编号为ii的节点的第jj个孩子是编号为kk的节点。其实大家应该清楚了。
CODE
inline void insert(char s[]) { int root=0,n; n = strlen(s); for(int i=0;i<n;i++) { int x = s[i] - 'a'; if(!node[root][x]) node[root][x] = ++cnt; root = node[root][x]; res[root] ++; } }
询问
其实也差不多:CODE
inline int Search(char s[]) { int root=0,n; n = strlen(s); for(int i=0;i<n;i++) { int x = s[i] - 'a'; if(!node[root][x]) return 0; root = node[root][x]; } return res[root]; }
1.如果是查询某个单词的话,我们用bool变量 v[i]表示节点i是否是单词结束的标志。
那么最后return的是v[root],所以在插入操作中插入完每个单词是,要对单词最后一个字母的v[i]置为true,其他的都是false
2、如果是查询前缀出现的次数的话,那就在开一个sum[],表示位置i被访问过的次数,
那么最后return的是sum[root]
这里前缀的次数是标记在前缀的最后一个字母所在位置的后一个位置上。
练手题:
HDU 1251 统计难题相关文章推荐
- hash array mapped trie
- TRIE - Data Structure
- Trie 字典树
- Algorithm: The implementation of Trie Tree (C++)
- 字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
- [转]Trie—单词查找树
- To Trie or not to Trie – a comparison of efficient data structures
- Trie的应用及拼写检查器的优化
- hdu 1671|| zoj 2876 phone list(trie 水)
- 路由表的结构与算法分析--trie插入
- Trie (prefix tree) 实现 (Java)
- Trie的应用及拼写检查器的优化
- 【基础知识】Darts: Double-ARray Trie System
- Trie Tree介绍及其C#实现
- Trie —单词查找树
- trie tree 字典树的简介与实现
- poj2503Babelfish(Trie tree 或者map)
- HDU 1800 Flying to the Mars(trie)
- HDU4570----Multi-bit Trie----简单的DP
- 字典树(Trie查找单词再也不用担心超时了)