zju2346 Shortest Prefixes(字典树 trie)
2010-07-16 15:58
387 查看
总算自己做出一道字典树,内牛满面~
题意是给你一串单词,让你找出最短的前缀,使得该前缀能唯一识别该单词
我的方法是建立字典树,并给每个节点的使用次数赋值。
从单词的第一个字母开始找,若找到某个节点使用次数为1,则输出到该节点就是最短前缀。
若没有一个是为1的节点,就全部输出了,题意已说明。
题意是给你一串单词,让你找出最短的前缀,使得该前缀能唯一识别该单词
我的方法是建立字典树,并给每个节点的使用次数赋值。
从单词的第一个字母开始找,若找到某个节点使用次数为1,则输出到该节点就是最短前缀。
若没有一个是为1的节点,就全部输出了,题意已说明。
#include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<sstream> #include<set> #include<map> #include<queue> #include<stack> using namespace std; const int number=26; int Case=1; class Trie { public: int num; Trie *child[number]; Trie() { num=0; for(int i=0;i<number;i++) { child[i]=0; } } }; void Insert(Trie *head,char *str) { Trie *p=head; int len=strlen(str); for(int i=0;i<len;i++) { int x=str[i]-'a'; if(p->child[x]==0) { p->child[x]=new Trie(); } p=p->child[x]; p->num++; } } void run() { Trie *head=new Trie(); char str[21]; char word[10001][21]; int k=0; while(gets(str)) { if(strcmp(str,"")==0) break; strcpy(word[k++],str); Insert(head,str); } for(int i=0;i<k;i++) { Trie *p=head; printf("%s ",word[i]); int len=strlen(word[i]); for(int j=0;j<len;j++) { int x=word[i][j]-'a'; p=p->child[x]; if(p->num==1) { printf("%c",word[i][j]); break; } else { printf("%c",word[i][j]); } } printf("/n"); } } int main() { int t; scanf("%d",&t); cin.get(); cin.get(); while(t--) { if(Case>1) printf("/n"); run(); Case++; } return 0; }
相关文章推荐
- Trie(数字树、字典树、前缀树)
- 字典树trie
- 字典树(trie)模板
- trie 字典树 转
- 字典树(trie)
- kyeremal-poj2001-Shortest Prefixes-字典树trie
- POJ 2001 Shortest Prefixes (字典树 TRIE)
- HDU 1247 Hat’s Words(字典树Trie)
- zoj 3228 trie tree(字典树)
- Trie 字典树2
- zoj 1109 Language of FatMouse(字典树Trie)
- Trie--字典树
- 字典树 Trie 的实现
- 字典树(Trie、prefix tree)及其应用(求一个数组中的最大异或值)
- 字典树(Trie)
- Trie(字典树)的学习
- 208. Implement Trie (Prefix Tree)字典树
- 字典树Trie的简单题目
- C++里创建 Trie字典树(中文词典)(三)(联想)
- Data Structure: Trie(字典树)