POJ 2001 Shortest Prefixes(字典树Trie)
http://poj.org/problem?id=2001
题意:
给你多个单词组成的词典,现在要你输出每个单词对应的前缀,使得每个前缀唯一。如果不存在唯一前缀就直接输出单词本身。比如字典里面有car 和caraaab 两个单词,那么对于caraaab就输出cara,对于car就输出car。
分析:
直接用所有单词建立字典树,并且字典树节点的v值表示以该节点为根的子树下有多少个单词.
然后对于每个单词查找一遍字典树,顺着当前单词的字母往下走,如果走要一个节点的v值==1,那么就直接输出该节点并返回,否则输出当前的完整单词.
AC代码:1A
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxnode=20000+100; const int sigma_size=26; struct Trie { int ch[maxnode][sigma_size]; int val[maxnode]; int sz; void init() { sz=1; memset(ch[0],0,sizeof(ch[0])); val[0]=0; } void insert(char *s) { int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'a'; if(ch[u][id]==0) { ch[u][id]=sz; val[sz]=0; memset(ch[sz],0,sizeof(ch[sz])); sz++; } u=ch[u][id]; val[u]++; } } void find(char *s) { int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'a'; u=ch[u][id]; printf("%c",s[i]); if(val[u]==1) return ; } } }trie; char word[1000][25]; int cnt; int main() { cnt=0; trie.init(); while(scanf("%s",word[cnt])==1) { trie.insert(word[cnt++]); } for(int i=0;i<cnt;i++) { printf("%s ",word[i]); trie.find(word[i]); printf("\n"); } return 0; }