FJNU.1469
Description
在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:
1、根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
2、从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
3、在满足上述条件下,该单词查找树的节点数最少。
例:图一的单词列表对应图二的单词查找树:
对一个确定的单词列表,请统计对应的单词查找树的节点数(包括根节点)。
Input
输入为一个单词列表,每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字符组成,长度不超过63个字符。文件总长度不超过32K,至少有一行数据。
Output
输出仅包含一个整数和一个换行/回车符。该整数为单词列表对应的单词查找树的节点数。
Sample Input
A
AN
ASP
AS
ASC
ASCII
BAS
BASIC
Sample Output
13
Source
NOI
My Program
#include
<
iostream
>
#include
<
string
.h
>
using
namespace
std;
typedef
struct
link
...
{
struct link * ch[ 26 ];
}
chars;
int
main()
...
{
chars * tree, * p, * q;
char str[ 80 ];
int i,j,n,s = 1 ;
tree = new chars;
for (i = 0 ;i < 26 ;i ++ )
tree -> ch[i] = NULL;
while (cin >> str)
... {
p = tree;
n = strlen(str);
for (i = 0 ;i < n;i ++ )
if (p -> ch[(str[i] - ' A ' )] == NULL)
... {
q = new chars;
for (j = 0 ;j < 26 ;j ++ )
q -> ch[j] = NULL;
p -> ch[(str[i] - ' A ' )] = q;
p = q;s ++ ;
}
else
p = p -> ch[(str[i] - ' A ' )];
}
cout << s << endl;
return 0 ;
}
YOYO's Note:
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄它是华丽的分隔线
【题意简述】
创建单词查找树 = = ……
【粗略分析】
明显一个结点最多有26个分支,
可以当作26叉树处理……
每次增加新结点的时候计数,
文件读完了直接输出结点数就好了~
【C++源代码】
#include
<
iostream
>
#include
<
string
.h
>
using
namespace
std;
typedef
struct
link
...
{
struct link * ch[ 26 ];
}
chars;
int
main()
...
{
chars * tree, * p, * q;
char str[ 80 ];
int i,j,n,s = 1 ;
tree = new chars;
for (i = 0 ;i < 26 ;i ++ )
tree -> ch[i] = NULL;
while (cin >> str)
... {
p = tree;
n = strlen(str);
for (i = 0 ;i < n;i ++ )
if (p -> ch[(str[i] - ' A ' )] == NULL)
... {
q = new chars;
for (j = 0 ;j < 26 ;j ++ )
q -> ch[j] = NULL;
p -> ch[(str[i] - ' A ' )] = q;
p = q;s ++ ;
}
else
p = p -> ch[(str[i] - ' A ' )];
}
cout << s << endl;
return 0 ;
}
【注意事项】
※ 大数据量scanf!..
※ 不要忘了初始每个分支结点的指针为NULL
※ 移动好指针,一个单词放完后又回到根结点~
【点评】
正好练习下数据结构里树的创建。。