先按长度从大到小排序。
然后判断短的是不是长的的前缀就好。
注意要回收内存
第二篇为静态分配内存。。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; struct node { struct node *br[10]; int num; }; node *root; void Trie_init() { root=new node; root->num=0; for(int i=0;i<10;i++)root->br[i]=NULL; } void Trie_insert(char str[]) { int len=strlen(str); node *s=root; for(int i=0;i<len;i++) { int id=str[i]-‘0‘; if(s->br[id]==NULL) { node *t=new node; for(int j=0;j<10;j++)t->br[j]=NULL; t->num=0; s->br[id]=t; } s=s->br[id]; s->num++; } } int Trie_find(char str[]) { int len=strlen(str); node *s; s=root; int res; for(int i=0;i<len;i++) { int id=str[i]-‘0‘; if(s->br[id]==NULL)return 0; else { s=s->br[id]; res=s->num; } } return res; } void Trie_del(node *p) { for(int i=0;i<10;i++) { if(p->br[i]!=NULL) Trie_del(p->br[i]); } free(p); } struct t { char str[12]; int len; bool operator < (const t &cmp)const { return len>cmp.len; } }save[10005]; int main() { int T; scanf("%d",&T); while(T--) { Trie_init(); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",save[i].str); save[i].len=strlen(save[i].str); } sort(save+1,save+1+n); bool flg=true; for(int i=1;i<=n;i++) { if(Trie_find(save[i].str)){flg=false;break;} else Trie_insert(save[i].str); } if(flg)printf("YES\n"); else printf("NO\n"); Trie_del(root); } return 0; }
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; struct node { struct node *br[10]; int num; }; node trid[100000]; node *root; int cnt; void Trie_init() { cnt=0; root=new node; root->num=0; for(int i=0;i<10;i++)root->br[i]=NULL; } void Trie_insert(char str[]) { int len=strlen(str); node *s=root; for(int i=0;i<len;i++) { int id=str[i]-‘0‘; if(s->br[id]==NULL) { node *t=&trid[cnt++]; for(int j=0;j<10;j++)t->br[j]=NULL; t->num=0; s->br[id]=t; } s=s->br[id]; s->num++; } } int Trie_find(char str[]) { int len=strlen(str); node *s; s=root; int res; for(int i=0;i<len;i++) { int id=str[i]-‘0‘; if(s->br[id]==NULL)return 0; else { s=s->br[id]; res=s->num; } } return res; } struct t { char str[12]; int len; bool operator < (const t &cmp)const { return len>cmp.len; } }save[10005]; int main() { int T; scanf("%d",&T); while(T--) { Trie_init(); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",save[i].str); save[i].len=strlen(save[i].str); } sort(save+1,save+1+n); bool flg=true; for(int i=1;i<=n;i++) { if(Trie_find(save[i].str)){flg=false;break;} else Trie_insert(save[i].str); } if(flg)printf("YES\n"); else printf("NO\n"); } return 0; }
hdu 1671 Phone List (字典树),布布扣,bubuko.com
原文:http://blog.csdn.net/u010709592/article/details/22528317