#include <iostream>
#include <string.h>
#include <string>
using namespace std;
struct trie {
bool word = false;
trie* adj[26];
trie() {
for (int i = 0; i < 26; i++) adj[i] = NULL;
}
void add(char* s) {
trie* t = this;
while (*s) {
if (t->adj[s[0] - 'a'] == NULL) {
trie* novaPtr = create(s + 1);
t->adj[s[0] - 'a'] = novaPtr;
return;
}
else {
t = t->adj[s[0] - 'a'];
}
s++;
}
}
trie* create(char* s) {
trie *t = new trie();
trie* point = t;
while (*s) {
point->adj[s[0] - 'a'] = new trie(); // allocate memory on heap
point = point->adj[s[0] - 'a'];
s++;
}
point->word = true;
return t; // the pointer on heap memeroy is returned.
}
void seek() {
trie* t = this;
run(t, "");
}
void run(trie* t, string s) {
if (t->word) {
cout << s << "\n";
}
for (int i = 0; i < 26; i++) {
if (t->adj[i] != NULL) {
run(t->adj[i], s + char('a' + i));
}
}
}
};
int main() {
trie t;
t.add("ball");
t.seek();
t.add("balloon");
t.add("cluster");
t.seek();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdHJpbmc+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IHRyaWUgewoJYm9vbCB3b3JkID0gZmFsc2U7Cgl0cmllKiBhZGpbMjZdOwoJdHJpZSgpIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIGFkaltpXSA9IE5VTEw7Cgl9CgoJdm9pZCBhZGQoY2hhciogcykgewoJCXRyaWUqIHQgPSB0aGlzOwoKCQl3aGlsZSAoKnMpIHsKCQkJaWYgKHQtPmFkaltzWzBdIC0gJ2EnXSA9PSBOVUxMKSB7CgkJCQl0cmllKiBub3ZhUHRyID0gY3JlYXRlKHMgKyAxKTsKCQkJCXQtPmFkaltzWzBdIC0gJ2EnXSA9IG5vdmFQdHI7CgkJCQlyZXR1cm47CgkJCX0KCQkJZWxzZSB7CgkJCQl0ID0gdC0+YWRqW3NbMF0gLSAnYSddOwoJCQl9CgkJCXMrKzsKCQl9Cgl9CgoJdHJpZSogY3JlYXRlKGNoYXIqIHMpIHsKCQl0cmllICp0ID0gbmV3IHRyaWUoKTsKCQl0cmllKiBwb2ludCA9IHQ7CgkJd2hpbGUgKCpzKSB7CgkJCXBvaW50LT5hZGpbc1swXSAtICdhJ10gPSBuZXcgdHJpZSgpOyAvLyBhbGxvY2F0ZSBtZW1vcnkgb24gaGVhcAoJCQlwb2ludCA9IHBvaW50LT5hZGpbc1swXSAtICdhJ107CgkJCXMrKzsKCQl9CgkJcG9pbnQtPndvcmQgPSB0cnVlOwoJCXJldHVybiB0OyAvLyB0aGUgcG9pbnRlciBvbiBoZWFwIG1lbWVyb3kgaXMgcmV0dXJuZWQuCgl9CgoJdm9pZCBzZWVrKCkgewoJCXRyaWUqIHQgPSB0aGlzOwoJCXJ1bih0LCAiIik7Cgl9CgoJdm9pZCBydW4odHJpZSogdCwgc3RyaW5nIHMpIHsKCQlpZiAodC0+d29yZCkgewoJCQljb3V0IDw8IHMgPDwgIlxuIjsKCQl9CgkJZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CgkJCWlmICh0LT5hZGpbaV0gIT0gTlVMTCkgewoJCQkJcnVuKHQtPmFkaltpXSwgcyArIGNoYXIoJ2EnICsgaSkpOwoJCQl9CgkJfQoJfQp9OwoKaW50IG1haW4oKSB7Cgl0cmllIHQ7Cgl0LmFkZCgiYmFsbCIpOwoJdC5zZWVrKCk7Cgl0LmFkZCgiYmFsbG9vbiIpOwoJdC5hZGQoImNsdXN0ZXIiKTsKCXQuc2VlaygpOwp9Cg==