• 【NOI2000】 单词查找树


    问题描述

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

    1. 根结点不包含字母,除根结点外每一个结点都仅包含一个大写英文字母;

    2. 从根结点到某一结点,路径上经过的字母依次连起来所构成的字母序列,称为该结点对应的单词。单词列表中的每个单词,都是该单词查找树某个结点所对应的单词;

    3. 在满足上述条件下,该单词查找树的结点数最少。

    4. 例如下图左边的单词列表就对应于右边的单词查找树。注意,对一个确定的单词列表,请统计对应的单词查找树的结点数(包含根结点)。

    示意图

    输入格式

    为一个单词列表,每一行仅包含一个单词和一个换行 "/" 回车符。每个单词仅由大写的英文字母组成,长度不超过 63 个字母 。文件总长度不超过 32K ,至少有一行数据。

    输出格式

    仅包含一个整数,该整数为单词列表对应的单词查找树的结点数

    样例一

    input

    A
    AN
    ASP
    AS
    ASC
    ASCII
    BAS
    BASIC
    

    output

    13
    

    数据范围与约定

    时间限制: 1s1s

    内存限制: 256MB256MB256MB

    头一次见string类型这样用2333

    就是说:例如

    string a[500];

    这样的变量a是可以变为二维数组的;

    比如:a[i][j] 就表示了字符串a这个集合中有字符串a[i];而a[i][j]表示串a的第j个字符;

    而且,原来string自带.size();再也不用sizeof()了qwq

    看来我基础并不过关

    好了上代码:
    其实我是爆搜的:

    (怕不是出题人懒得写数据

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int  maxn=100010;
     4 string dan[maxn];//单词的集合
     5 int ans;
     6 int main(){
     7     int i=1;
     8     while (cin>>dan[i]) i++; //读入数据
     9     int n=i-1; //最后多加了一个1
    10     sort (dan+1,dan+1+n); //将字符串排序,注意,是串的排序而不是字符的
    11     ans=dan[1].size()+1; //最小那个铁定是树的一条链
    12     for(int i=2;i<=n;i++){
    13         int j=0; //每次初始化j,保证刚开始扫的时候j没有值
    14         while (dan[i][j]==dan[i-1][j]) {
    15             j++; //统计有多少个字母一样可以合并
    16         }
    17         ans+=(dan[i].size()-j); //每次加上不一样的,即节点
    18     }
    19     cout<<ans; //输出
    20     return 0;
    21 }
  • 相关阅读:
    Java文件的 In 与 Out 的相对性
    EBS 生产环境并发管理器重启步骤详解经验啊
    HDOJ1285 确定比赛名次(拓扑排序)
    对线性回归、逻辑回归、各种回归的概念学习
    一个截屏工具制作的全过程记录——如何使用“拿来主义”
    免费的响应式bootstrap管理员后台界面主题 Charisma
    挖掘管理价值:企业软件项目管理实战
    浏览器自动填充表单导致网页样式丢失
    「译」开发者如何提升和推销自己
    xcopy的一次误用及解决办法
  • 原文地址:https://www.cnblogs.com/luv-letters/p/9512250.html
Copyright © 2020-2023  润新知