hiho 2 Trie树
来源:互联网 发布:网络售后服务包括 编辑:程序博客网 时间:2024/06/05 03:51
问题描述
这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?”
数据结构
如上图所示就是一个trie树。
实现
树的构建
我们可以先计算出树的最大节点个数N,然后开辟长度为N个node的数组来存储树,设置一个变量trieNum 表示当前用了多少个节点,当要申请新节点时,将trieNum处的Node返回,并将trieNum++;
代码:
注意每个node 中的num 表示从根走到这点的字符串出现的次数。
#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>using namespace std;struct Node{ int num; int next[26];};enum {maxn = 1000000+5};struct Node trie[maxn];int trieNum = 1;void add(char *s){ int ptr = 0; trie[0].num++; for (int i=0; s[i]; i++) { if (trie[ptr].next[s[i]-'a']) { ptr = trie[ptr].next[s[i]-'a']; } else{// 申请新空间,并将指针指向下一级. trie[ptr].next[s[i]-'a'] = trieNum; ptr = trieNum; trieNum++; } trie[ptr].num++; }}int find(char *s){ int ptr=0; int i; for (i=0; s[i] && (ptr = trie[ptr].next[s[i]-'a']); i++); if (!ptr) return 0; else return trie[ptr].num;}#define OJint main(){ #ifndef OJ freopen("in.txt", "r", stdin); #endif // OJ memset(trie, 0, sizeof(struct Node)*maxn); int n, m; scanf("%d", &n); char s[20]; while(n){ n--; scanf("%s", s); add(s); } scanf("%d", &m); while(m){ m--; scanf("%s", s); printf("%d\n", find(s)); } return 0;}
0 0
- hiho 2 Trie树
- Trie树 hiho一下第2周
- HiHo 1014 Trie树
- hiho一下 Trie树
- hiho 1014 : Trie树
- hiho#1014-Trie树
- hiho 1014 trie树
- hiho 第二周 trie树
- HIHO Trie树入门练习
- 【hiho一下】第二周 Trie树
- hiho一下第二周 Trie树
- hiho一下第二周:Trie树
- hiho第二周——Trie树
- hiho一下第二周#1014 : Trie树
- hiho一下第二周Trie树 题解
- hihocoder Trie树 hiho题库 #1014 : Trie树
- hiho-1014 Trie树 (Trie的建树与查询)
- hiho 4 Trie 图
- 技术人生“白天求生存,晚上谋发展”
- 运行报错:查询块具有不正确的结果列数
- 判断一个数是不是2的幕
- 最小生成树
- iPhone屏幕投射到Mac的解决方案
- hiho 2 Trie树
- iOS Swift混编详解
- 五大常用算法详解—转
- 调试临时日志输出
- logback配置文件
- 设计模式中类的关系
- [sicily]1500. Prime Gap
- Android 弹软键盘时listview的变化控制
- android下的三种动画