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
1 #include<iostream> 2 #include<string> 3 #include <algorithm> 4 using namespace std; 5 string a[7000],z; 6 int n,i,j,t; 7 int main() 8 { 9 while(cin>>a[++n]); 10 for( i=1;i<n;++i) ////单词从小到大排序 11 for(j =i+1;j<=n;++j) 12 if(a[i]>a[j]) 13 swap(a[i],a[j]); 14 t=a[1].size(); ////先累加第1个单词的长度 15 for(i=2;i<=n;++i) ////依次计算每个单词对前一单词的差 16 { 17 j=0; 18 while(a[i][j]==a[i-1][j]&&j<a[i-1].size() )++j; ////求两个单词相同部分的长度 19 t+=(a[i].size() -j); ////累加两个单词的差length(a[i])-j 20 } 21 cout<<t+1; 22 return 0; 23 }