字典树(Trie)
来源:互联网 发布:网页怎么连接数据库 编辑:程序博客网 时间:2024/05/16 19:11
如图所示即为字典树的储存方式
典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)
可以看出字典树利用公共前缀进行了优化
利用一道模板题来讲解一下字典树的写法和思想
Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2
3
1
0
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef struct T{ int count;//存字母出现的次数 struct T* next[26];}Node, *Trie;Node* create(){ Node* node=(Node *)malloc(sizeof(Node)); node->count=0; memset(node->next,0,sizeof(node->next)); return node;}int insert(Trie root,char* word){ Trie node=root; int id; while(*word) { id=*word-'a';/*用下标来记录字母*/ if(!node->next[id])/*如果这个字母还不存在*/ node->next[id]=create();/*开辟空间存*/ node=node->next[id];/*一个新字母的出现存的是下一行,为了简化书写,更新node*/ node->count++;/*记录次字母走了多少次*/ word++;/*下一个字母*/ } return 0;}int search(Trie root,char* word){ Trie node=root; int id; while(*word) { id=*word-'a'; node=node->next[id]; ++word; if(!node)/*模式串中某字母没有出现*/ return 0; } return node->count;}int main(){ Trie root=create(); char str[12]; bool flag=0; while(gets(str)&&strlen(str)) insert(root,str);//插入 while(gets(str)) printf("%d\n",search(root,str)); return 0;}
阅读全文
0 0
- 字典树(Trie)
- Trie(字典)树
- 字典树(Trie)
- 字典树(trie)
- 字典树(Trie)
- 字典树(trie)
- Trie(字典树)
- Trie(字典树)
- 字典树(Trie)
- 字典树(Trie)
- Codevs 4189 字典(字典树Trie)
- 字典树(trie树)
- Trie树(字典树)
- 字典树(Trie树)
- Trie树(字典树)
- 字典树(trie树)
- 字典树(Trie树)
- trie树(字典树)
- 队列的用法
- 2017ICPC北京网络赛Minimum(线段树+区间最值)
- Java 位运算(移位、位与、或、异或、非)
- 生成指定个数的随机码,同时包含大小写字母和数字
- Mybatis下的数据库表自关联查询
- 字典树(Trie)
- MAC电脑 系统 恢复出厂设置
- 3d地球app
- CUDA学习笔记(1)数组求和
- 关于NI CompactRIO自定义模块中FPGA与Labview FPGA中编程的一点理解
- 在屏幕上用"*"输出菱形图案
- 做(do) (贪心模拟 dp)
- 从《模仿游戏》认识图灵
- hibernate--12.criteria