字典树模板
附一个比较详细的讲解 http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html
模板题(HDU 1671)
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN=10; typedef struct Trie{ int v; Trie *Next[MAXN]; }Trie; Trie *root; void createTrie(char *str) { int len=strlen(str); Trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'0'; if(p->Next[id]==NULL) { q=(Trie*)malloc(sizeof(Trie)); q->v=1; for(int j=0;j<MAXN;j++) q->Next[j]=NULL; p->Next[id]=q; p=p->Next[id]; } else { p->Next[id]->v++; p=p->Next[id]; } } } int findTrie(char *str) { int len=strlen(str); Trie *p=root; for(int i=0;i<len;i++) { int id=str[i]-'0'; p=p->Next[id]; if(p==NULL) return 0; } return p->v; } int deal(Trie *T) { int i; if(T==NULL) return 0; for(int i=0;i<MAXN;i++) { if(T->Next[i]!=NULL) deal(T->Next[i]); } free(T); return 0; } int main() { char str[10010][15]; int t,n,flag; scanf("%d",&t); while(t--){ flag=1; root=(Trie*)malloc(sizeof(Trie)); for(int i=0;i<MAXN;i++) root->Next[i]=NULL; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",str[i]); createTrie(str[i]); } for(int i=0;i<n;i++) { if(findTrie(str[i])>1) { flag=0; break; } } if(flag==1)puts("YES"); else puts("NO"); deal(root); } return 0; }