题目描述
在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都画出与单词列表所对应的单词查找树,其特点如下:
1.根结点不包含字母,除根结点外每一个结点都仅包含一个大写英文字母;
2.从根结点到某一结点,路径上经过的字母依次连起来所构成的字母序列,称为该结点对应的单词。单词列表中的每个单词,都是该单词查找树某个结点所对应的单词;
3.在满足上述条件下,该单词查找树的结点数最少。
4.例如图左边的单词列表就对应于右边的单词查找树。注意,对一个确定的单词列表,请统计对应的单词查找树的结点数(包含根结点)。
输入输出格式
输入格式:
输入文件名为word.in,该文件为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字母组成,长度不超过63个字母 。文件总长度不超过32K,至少有一行数据。
输出格式:
输出文件名为word.out,该文件中仅包含一个整数,该整数为单词列表对应的单词查找树的结点数。
题解awa
这就是一道十分基础的字典树的题目,所以...就不多解释啦(懒~
啊哈哈哈哈哈,代码来咯~
题目:单词查找树
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
string a[1000000];
long long n = 0, sum = 0, j = 0;
int main() {
freopen("word.in", "r", stdin);
freopen("word.out", "w", stdout);
while (cin >> a[n++])
;
sort(a, a + n);
sum += a[0].length();
for (int i = 1; i < n; i++) {
j = 0;
while (a[i][j] == a[i - 1][j] && j < a[i].length()) {
j++;
}
sum += (a[i].length() - j);
}
cout << sum + 1 << endl;
return 0;
}
光速撤退