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
※ 移动好指针,一个单词放完后又回到根结点~
【点评】
正好练习下数据结构里树的创建。。