hdu1671 字典树
比较简单,出现前缀。不过要释放空间。
#include <stdio.h> #include <string.h> #include <stdlib.h> struct trie { trie *next[10]; int sum; }; trie *root; char str[10002][11]; void init() { root=(trie*)malloc(sizeof(trie)); for(int i=0;i<10;i++) root->next[i]=NULL; root->sum=0; } void insert(char *s) { int i,j,len=strlen(s); trie *p=root,*q; for(i=0;i<len;i++) { int id=s[i]-'0'; if(p->next[id]==NULL) { q=(trie*)malloc(sizeof(trie)); for(j=0;j<10;j++) q->next[j]=NULL; q->sum=0; p->next[id]=q; } p=p->next[id]; p->sum++; } } int query(char *s) { int i,j,len=strlen(s); trie *p=root; for(i=0;i<len;i++) { int id=s[i]-'0'; p=p->next[id]; } if(p->sum>1) return 1; return 0; } void freetrie(trie *rt) { for(int i=0;i<10;i++) if(rt->next[i]!=NULL) freetrie(rt->next[i]); free(rt); } int main() { int flag,i,j,t,n; scanf("%d",&t); while(t--) { init(); flag=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",str[i]); insert(str[i]); } for(i=0;i<n;i++) { flag=query(str[i]); if(flag)break; } if(flag) printf("NO\n"); else printf("YES\n"); freetrie(root);//释放内存 } }