扩大
缩小

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

 

posted @ 2018-08-21 16:41  luv_letters  阅读(322)  评论(0编辑  收藏  举报
AmazingCounters.com
博文导航目录