【NOI2000】 单词查找树
问题描述
在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:
根结点不包含字母,除根结点外每一个结点都仅包含一个大写英文字母;
从根结点到某一结点,路径上经过的字母依次连起来所构成的字母序列,称为该结点对应的单词。单词列表中的每个单词,都是该单词查找树某个结点所对应的单词;
在满足上述条件下,该单词查找树的结点数最少。
例如下图左边的单词列表就对应于右边的单词查找树。注意,对一个确定的单词列表,请统计对应的单词查找树的结点数(包含根结点)。
输入格式
为一个单词列表,每一行仅包含一个单词和一个换行 "/" 回车符。每个单词仅由大写的英文字母组成,长度不超过 63 个字母 。文件总长度不超过 32K ,至少有一行数据。
输出格式
仅包含一个整数,该整数为单词列表对应的单词查找树的结点数
样例一
input
A AN ASP AS ASC ASCII BAS BASICoutput
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 }
“胡须如草芥疯长,悲欢不过梦一场”