码迷,mamicode.com
首页 > 其他好文 > 详细

1337:【例3-2】单词查找树

时间:2021-06-28 20:18:32      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:组成   clu   pac   整数   描述   +=   style   rgba   size   

【题目描述】

在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:

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;
}

 

1337:【例3-2】单词查找树

标签:组成   clu   pac   整数   描述   +=   style   rgba   size   

原文地址:https://www.cnblogs.com/gaojs/p/14941951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!