1337:【例3-2】單詞查詢樹
阿新 • • 發佈:2021-06-27
【題目描述】
在進行文法分析的時候,通常需要檢測一個單詞是否在我們的單詞列表裡。為了提高查詢和定位的速度,通常都畫出與單詞列表所對應的單詞查詢樹,其特點如下:
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; }