#include <bits/stdc++.h>
using
namespace
std;
const
int
ALPHABET_SIZE = 26;
struct
TrieNode {
struct
TrieNode* children[ALPHABET_SIZE];
bool
isEndOfWord;
};
struct
TrieNode* getNode(
void
)
{
struct
TrieNode* pNode =
new
TrieNode;
pNode->isEndOfWord =
false
;
for
(
int
i = 0; i < ALPHABET_SIZE; i++)
pNode->children[i] = NULL;
return
pNode;
}
void
insert(
struct
TrieNode* root, string key)
{
struct
TrieNode* pCrawl = root;
for
(
int
i = 0; i < key.length(); i++) {
int
index = key[i] -
'a'
;
if
(!pCrawl->children[index])
pCrawl->children[index] = getNode();
if
(i == key.length() - 1)
pCrawl->children[index]->isEndOfWord =
true
;
pCrawl = pCrawl->children[index];
}
}
string getString(
char
x)
{
string s(1, x);
return
s;
}
string search(
struct
TrieNode* root, string key)
{
struct
TrieNode* pCrawl = root;
string s =
""
;
for
(
int
i = 0; i < key.length(); i++) {
int
index = key[i] -
'a'
;
if
(!pCrawl->children[index])
break
;
s += getString((
char
)key[i]);
pCrawl = pCrawl->children[index];
}
if
(pCrawl->isEndOfWord)
return
s;
return
"-1"
;
}
int
main()
{
string arr[] = {
"Geeks"
,
"Geek"
,
"Geekss"
,
"Geekks"
};
int
n =
sizeof
(arr) /
sizeof
(string);
struct
TrieNode* root = getNode();
for
(
int
i = 0; i < n; i++)
insert(root, arr[i]);
string queries[] = {
"Geek"
,
"Geeks"
,
"Geekk"
,
"Gee"
};
int
q =
sizeof
(queries) /
sizeof
(string);
for
(
int
i = 0; i < q; i++)
cout << search(root, queries[i]) << endl;
return
0;
}