hdu 1247 Hat’s Words (字典樹)

Hat’s Words

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6648    Accepted Submission(s): 2456


php

Problem Description
A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
You are to find all the hat’s words in a dictionary.
 


Input
Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
Only one case.
 


Output
Your output should contain all the hat’s words, one per line, in alphabetical order.
 


Sample Input
a
ahat
hat
hatword
hziee
word
 


Sample Output
ahat
hatword
 


Author
戴帽子的
 


Recommend
Ignatius.L   |   We have carefully selected several similar problems for you:   1298  2846  1305  3460  2072 
 

 

內容轉自: http://blog.csdn.net/azheng51714/article/details/7836687node

字典樹,又稱單詞查找樹,Trie樹,是一種樹形結構,典型應用是用於統計,排序和保存大量的字符串,因此常常被搜索引擎系統用於文本詞頻統計。它的優勢是:利用字符串的公共前綴來節約存儲空間,最大限度的減小無謂的字符串比較,查詢效率比哈希表高。

它有三個基本性質,根節點不包含字符,除根節點外每個節點都只包含一個字符,從根節點到某一節點,路徑上通過的字符鏈接起來,爲該節點對應的字符串,每一個節點的全部子節點包含的字符都不相同。算法

 

字典樹的插入,刪除和查找都很是簡單,用一個一重循環便可。
1. 從根節點開始一次搜索
2. 取得要查找關鍵詞的第一個字母,並根據該字母選擇對應的子樹並轉到該子樹繼續進行檢索
3. 在相應的子樹上,取得要查找關鍵詞的第二個字母,並進一步選擇對應的子樹進行檢索
4. 迭代過程...
5. 在某個節點處,關鍵詞的全部字母已被取出,則讀取附在該節點上的信息,即完成查找

字典樹的應用
1.字典樹在串的快速檢索中的應用。
給出N個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最先出現的順序寫出全部不在熟詞表中的生詞。
在這道題中,咱們能夠用數組枚舉,用哈希,用字典樹,先把熟詞建一棵樹,而後讀入文章進行比較,這種方法效率是比較高的。

2. 字典樹在「串」排序方面的應用
給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出
用字典樹進行排序,採用數組的方式建立字典樹,這棵樹的每一個結點的全部兒子很顯然地按照其字母大小排序。對這棵樹進行先序遍歷便可

3. 字典樹在最長公共前綴問題的應用
對全部串創建字典樹,對於兩個串的最長公共前綴的長度即他們所在的結點的公共祖先個數,因而,問題就轉化爲最近公共祖先問題(之後補上)。

下面是在網上找的一個簡單的代碼,忘記出處了。在這裏並無專門一個CHAR來存儲字符,而是經過位置來肯定是哪一個字符,num = str[i] - 'a';
題意:
       

題目大意:給定一些單詞(按字典序給出), 按字典序輸出全部知足條件的單詞(條件:該單詞由其它兩個單詞構成)數組

算法描述:先把全部的單詞構形成一顆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 }
相關文章
相關標籤/搜索