问题描述
在进行文法分析的时候,一般须要检测一个单词是否在咱们的单词列表里。为了提升查找和定位的速度,一般都画出与单词列表所对应的单词查找树,其特色以下:c++
根结点不包含字母,除根结点外每个结点都仅包含一个大写英文字母;数组
从根结点到某一结点,路径上通过的字母依次连起来所构成的字母序列,称为该结点对应的单词。单词列表中的每一个单词,都是该单词查找树某个结点所对应的单词;atom
在知足上述条件下,该单词查找树的结点数最少。spa
例以下图左边的单词列表就对应于右边的单词查找树。注意,对一个肯定的单词列表,请统计对应的单词查找树的结点数(包含根结点)。code
输入格式
为一个单词列表,每一行仅包含一个单词和一个换行 "/" 回车符。每一个单词仅由大写的英文字母组成,长度不超过 63 个字母 。文件总长度不超过 32K ,至少有一行数据。orm
输出格式
仅包含一个整数,该整数为单词列表对应的单词查找树的结点数xml
样例一
input
A AN ASP AS ASC ASCII BAS BASICoutput
13数据范围与约定
时间限制: 1s1sblog
内存限制: 256MB256MB256MB排序
头一次见string类型这样用2333ip
就是说:例如
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 }