#include <bits/stdc++.h>
using
namespace
std;
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
#define ALPHABET_SIZE (26)
#define CHAR_TO_INDEX(c) ((int)c - (int)'a')
struct
TrieNode
{
struct
TrieNode *children[ALPHABET_SIZE];
bool
isLeaf;
};
struct
TrieNode *getNode(
void
)
{
struct
TrieNode *pNode =
new
TrieNode;
pNode->isLeaf =
false
;
for
(
int
i = 0; i < ALPHABET_SIZE; i++)
pNode->children[i] = NULL;
return
pNode;
}
void
insert(
struct
TrieNode *root,
const
char
*key)
{
int
length =
strlen
(key);
struct
TrieNode *pCrawl = root;
for
(
int
level = 0; level < length; level++)
{
int
index = CHAR_TO_INDEX(key[level]);
if
(!pCrawl->children[index])
pCrawl->children[index] = getNode();
pCrawl = pCrawl->children[index];
}
pCrawl->isLeaf =
true
;
}
int
wordCount(
struct
TrieNode *root)
{
int
result = 0;
if
(root -> isLeaf)
result++;
for
(
int
i = 0; i < ALPHABET_SIZE; i++)
if
(root -> children[i])
result += wordCount(root -> children[i]);
return
result;
}
int
main()
{
char
keys[][8] = {
"the"
,
"a"
,
"there"
,
"answer"
,
"any"
,
"by"
,
"bye"
,
"their"
};
struct
TrieNode *root = getNode();
for
(
int
i = 0; i < ARRAY_SIZE(keys); i++)
insert(root, keys[i]);
cout << wordCount(root);
return
0;
}