1337:【例3-2】單詞查找樹

【題目描述】

在進行文法分析的時候,通常需要檢測一個單詞是否在我們的單詞列表裏。爲了提高查找和定位的速度,通常都畫出與單詞列表所對應的單詞查找樹,其特點如下:

1.根結點不包含字母,除根結點外每一個結點都僅包含一個大寫英文字母;

2.從根結點到某一結點,路徑上經過的字母依次連起來所構成的字母序列,稱爲該結點對應的單詞。單詞列表中的每個單詞,都是該單詞查找樹某個結點所對應的單詞;

3.在滿足上述條件下,該單詞查找樹的結點數最少。

4.例如圖3-2左邊的單詞列表就對應於右邊的單詞查找樹。注意,對一個確定的單詞列表,請統計對應的單詞查找樹的結點數(包含根結點)。

【輸入】

爲一個單詞列表,每一行僅包含一個單詞和一個換行/回車符。每個單詞僅由大寫的英文字母組成,長度不超過63個字母 。文件總長度不超過32K,至少有一行數據。

【輸出】

僅包含一個整數,該整數爲單詞列表對應的單詞查找樹的結點數。

【輸入樣例】

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

【輸出樣例】

13
#include <bits/stdc++.h>
using namespace std;

struct Node { // 節點
    map<char, Node> sons;
};

int Count(Node &root)
{
    int ans = root.sons.size();
    map<char, Node>::iterator it;
    for (it = root.sons.begin(); it != root.sons.end(); ++it) {
        // cout << it->first << " ";
        ans += Count(it->second);
    }
    return ans;
}

int main()
{
    // freopen("1.txt", "r", stdin);
    string s;
    Node root;
    while (cin >> s) {
        Node *pNode = &root;
        for (int i = 0; i < s.size(); i++) {
            if (pNode->sons.count(s[i]) == 0) {
                pNode->sons[s[i]] = Node();
            };
            pNode = &pNode->sons[s[i]];
        }
    }
    cout << Count(root) + 1;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章