連結:http://acm.hdu.edu.cn/showproblem.php?pid=1671
題目的意思可能不好理解:
其實他的意思是:給你號碼,如果有出現其中的號碼是其他號碼的首碼,則NO,否則YES。
用字典樹儲存號碼,然後搜尋是否有首碼
很明白的一道模板題了,就不多做解釋了。
不過值得一提的是,這道題如果沒有寫上樹的釋放函數,肯定錯。
其實一般字典樹的題目都寫上這個函數,是不會有問題的。
AC代碼如下:
#include<iostream>#include<stdio.h>#include<cstring>using namespace std;typedef struct tree{int num;tree *next[11];tree(){num=0;int i;for(i=0;i<11;i++){ next[i]=NULL;}}}Node;Node *head;void UFset(){int i;head=new Node; //頭結點for(i=0;i<11;i++)//26個結點,初始化{head->next[i]=NULL; head->num=0;}}void Tree_insert(char *str){Node *s=head,*t;int len=strlen(str);int i;for(i=0;i<len;i++){int id=str[i]-'0';if(s->next[id]==NULL){t=new Node;s->next[id]=t;}s=s->next[id];s->num++;}}int Tree_Find(char *str){int count;int len=strlen(str);Node *s=head;int i;for(i=0;i<len;i++){int id=str[i]-'0';if(s->next[id]==NULL){count=0;return count;}else{s=s->next[id];count=s->num;}}return count;}void del(Node *head)//!!!釋放記憶體的部分!!!非常重要!!!!{Node *s=head;int i;for(i=0;i<11;++i)if(s->next[i]!=NULL)del(s->next[i]);free(s);}int main(){int ncase;scanf("%d",&ncase);while(ncase--){int n;char number[10010][15];scanf("%d%*c",&n);int i;UFset();for(i=0;i<n;i++){gets(number[i]);Tree_insert(number[i]);}int num=0;for(i=0;i<n;i++){if(Tree_Find(number[i])>1){num=1;break;}elsenum=0;}if(num==1)printf("NO\n");elseprintf("YES\n");del(head);}return 0;}