1729 单词查找树

2000年NOI全国竞赛

时间限制: 2 s
空间限制: 128000 KB
题目等级 : 大师 Master
 
 
 
 
题目描述 Description

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

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

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

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

对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)

输入描述 Input Description

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

输出描述 Output Description

该文件中仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。

样例输入 Sample Input

A

AN

ASP

AS

ASC

ASCII

BAS

BASIC

样例输出 Sample Output

13

数据范围及提示 Data Size & Hint
 
分析:
首先要对建树的过程有一个了解。对于当前被处理的单词和当前树:在根结点的子结点中找单词的第一位字母,若存在则进而在该结点的子结点中寻找第二位……如此下去直到单词结束,即不需要在该树中添加结点;或单词的第n位不能被找到,即将单词的第n位及其后的字母依次加入单词查找树中去。但,本问题只是问你结点总数,而非建树方案,且有32K文件,所以应该考虑能不能不通过建树就直接算出结点数?为了说明问题的本质,我们给出一个定义:一个单词相对于另一个单词的差:设单词1的长度为L,且与单词2从第N位开始不一致,则说单词1相对于单词2的差为L-N+1,这是描述单词相似程度的量。可见,将一个单词加入单词树的时候,须加入的结点数等于该单词树中已有单词的差的最小值。
    单词的字典顺序排列后的序列则具有类似的特性,即在一个字典顺序序列中,第m个单词相对于第m-1个单词的差必定是它对于前m-1个单词的差中最小的。于是,得出建树的等效算法:
① 读入文件;
② 对单词列表进行字典顺序排序;
③ 依次计算每个单词对前一单词的差,并把差累加起来。注意:第 一个单词相对于“空”的差为该单词的长度;
④ 累加和再加上1(根结点),输出结果。
就给定的样例,按照这个算法求结点数的过程如下表:

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
string a[];
int tot=;
int main()
{
int n=;
while(cin>>a[n])
n++;
sort(a+,a+n+);
int l=a[].length();
for(int i=;i<=n;i++)
{
int j=;
while(a[i][j]==a[i-][j]&&j<a[i].length())
{
j++;
}
tot=tot+(a[i].length()-j);
}
cout<<tot;
return ;
}

最新文章

  1. 基于讯为4412开发板的Android开发流程
  2. [代码片段]读取BMP文件
  3. Hosts文件是什么?
  4. c语言的预处理指令分3种   1&gt; 宏定义   2&gt; 条件编译   3&gt; 文件包含
  5. 自定义省市选择器 微信小程序多列选择器
  6. Spring Boot通过命令行启动发生FileNotFoundException
  7. HDU-5738
  8. c# 集合的长度为什么是可变的
  9. 51Nod-1006 最长公共子序列Lcs
  10. 关于Mysql6.0+的时区错乱问题
  11. npm run dev/build/serve
  12. MATLAB常用函数(不定时更新)
  13. js公共弹出窗插件
  14. 使用sed替换指定文件指定行的指定文本
  15. freemarker 中可以直接使用的内置对象
  16. tomcat原理详解
  17. RPDU
  18. SQL Server 2008 安装重启电脑失败
  19. .net 里面打不出来ConfigurationManager
  20. Lua程序设计(四)面向对象类继承

热门文章

  1. UML之类图详解
  2. 在Ninject 向构造参数中注入具有相同类型的参数
  3. Ubuntu上使用systemd创建服务文件来启动和监视底层网络应用程序实现守护进程
  4. pip 使用代理
  5. 【算法笔记】B1024 科学计数法
  6. 获取HTML代码用 像阿里巴巴
  7. UVALive - 7061 区间DP初步
  8. FLUENT 流体计算应用教程
  9. ACM 计算几何向量
  10. asp.net mvc 静态化