Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6648 Accepted Submission(s): 2456
php
內容轉自: http://blog.csdn.net/azheng51714/article/details/7836687node
字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,典型應用是用於統計,排序和保存大量的字符串,因此常常被搜索引擎系統用於文本詞頻統計。它的優勢是:利用字符串的公共前綴來節約存儲空間,最大限度的減小無謂的字符串比較,查詢效率比哈希表高。
它有三個基本性質,根節點不包含字符,除根節點外每個節點都只包含一個字符,從根節點到某一節點,路徑上通過的字符鏈接起來,爲該節點對應的字符串,每一個節點的全部子節點包含的字符都不相同。算法
題目大意:給定一些單詞(按字典序給出), 按字典序輸出全部知足條件的單詞(條件:該單詞由其它兩個單詞構成)數組
算法描述:先把全部的單詞構形成一顆trie圖,而後對全部的單詞進行枚舉,在trie圖上面判斷一個單詞是否由其它兩個單詞構成,具備的作法是先沿着路徑一直走,若是走到某個節點,該節點爲一個單詞的結尾,那麼再對剩餘的單詞再從trie圖的根開始遍歷,看是否能和一個單詞匹配,若匹配成功則該單詞知足要求,不然繼續進行匹配...搜索引擎
1 //31MS 5976K 1472 B G++ 2 #include<stdio.h> 3 #include<string.h> 4 struct node{ 5 bool is; 6 node *next[27]; 7 node(){ 8 is=false; 9 memset(next,0,sizeof(next)); 10 } 11 }; 12 char word[50005][27]; 13 void insert(node *root,char s[]) //建立字典樹 14 { 15 int i=0; 16 node *p=root; 17 while(s[i]){ 18 int j=s[i++]-'a'; 19 if(p->next[j]==NULL) 20 p->next[j]=new node(); 21 p=p->next[j]; 22 } 23 p->is=true; 24 } 25 int search(node *root,char s[]) 26 { 27 int i=0,len=0,stack[1005]; 28 node *p=root; 29 while(s[i]){ 30 int j=s[i++]-'a'; 31 //if(p-->next[j]==NULL) return 0; 32 p=p->next[j]; 33 if(p->is && s[i]) stack[len++]=i; //記錄截點 34 } 35 while(len){ //遍歷截點 36 int flag=1; 37 i=stack[--len]; 38 p=root; 39 while(s[i]){ 40 int j=s[i++]-'a'; 41 if(p->next[j]==NULL){ 42 flag=0;break; 43 } 44 p=p->next[j]; 45 } 46 if(flag && p->is) return 1; //知足條件,找到最後,且是一個單詞 47 } 48 return 0; 49 } 50 int main(void) 51 { 52 //freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin); 53 //freopen("C:\\Users\\Administrator\\Desktop\\out.txt","w",stdout); 54 int i=0; 55 node *root=new node(); 56 while(scanf("%s",word[i])!=EOF){ 57 insert(root,word[i]);i++; 58 } 59 for(int j=0;j<i;j++){ 60 if(search(root,word[j])) 61 puts(word[j]); 62 } 63 return 0; 64 }