【Trie树】模板题-POJ-2001
来源:互联网 发布:python 列表转为元组 编辑:程序博客网 时间:2024/05/16 23:59
题意:
给你若干个单词,写出能每个单词的最短前缀
也就是说这个前缀能准确代表这个单词,和其他单词 without ambiguity
思路:
建立字典树存下这几个单词,ct 数组记录每个节点的子节点数,显然子树宽度只有1的话,这个单词就被确定了,改造一下我们的 find_word 函数就行啦
哦。。这个结构体要怎么搞还坑了我一下,要向下面那样定义!
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxnode = 20050;const int sigma_size = 30;char str[1050][25];///字母表为全体小写字母的 Triestruct Trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int ct[maxnode]; int sz; ///节点总数 Trie() { sz = 1; memset(ch[0],0,sizeof(ch[0])); memset(ct,0,sizeof(ct)); } ///初始时只有一个根节点 int idx (char c) { return c - 'a'; } ///字符c的编号 ///插入字符串 s, 附加信息为 v。 注意 v 必须非0,因为 0 代表“本节点不是单词节点” void insert_word(char *s,int v){ int u = 0, n = strlen(s); for(int i=0; i<n; i++){ ct[u]++; int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] = v; ct[u]++; } void find_word(char *s){ int u = 0, n = strlen(s); for(int i=0; i<n; i++){ int c = idx(s[i]); printf("%c",s[i]); u = ch[u][c]; if(ct[u] == 1)break; } printf("\n"); }}my_trie;int main(){ freopen("input.txt","r",stdin); int top = 0; while(scanf("%s",str[top]) != EOF){ //cout<<str[top]<<endl; my_trie.insert_word(str[top],1); top++; } for(int i=0;i<top;i++) { printf("%s ",str[i]); my_trie.find_word(str[i]); } return 0;}
0 0
- poj 2001 Trie树 模板题
- 【Trie树】模板题-POJ-2001
- POJ 3630 Trie模板题
- POJ 3630 trie树模板
- POJ 1204 Word Puzzles [ Trie树 模板题]
- poj 2503 Trie模板
- POJ 2001 Trie树
- poj 2001 trie 树
- poj 2001 Trie树
- 【模板】Trie树模板
- POJ 2001 Trie 字典树
- POJ 2001 trie字典树
- hihocoder_1014: Trie树(Trie树模板题)
- POJ2001 - 字典树(trie)的模板题
- hdu1251 字典树trie 模板题
- trie树的模板
- trie树入门(模板)
- trie树模板
- 习题6-3 二叉树重建 UVa536
- 谷歌两年前就在偷偷研制快递无人机
- 远离致癌物
- RailsCasts12 Refactoring User Name Part 3 重构User name(三)
- SQL字符串截取
- 【Trie树】模板题-POJ-2001
- java学习课堂笔记5
- 利用java API实现本地文件上传至hdfs
- 三星推出第六款智能手表:可独立接打电话
- 黑马程序员-------description
- 2048 游戏中添加分数
- Excel2007无法在未启用宏的工作簿中保存vb项目
- linux less 命令 学习
- UVA - 11427 Expect the Expected (DP+概率)