#include<iostream>
using namespace std;
struct node{
bool eow;
node* child[26];
};
node *root;
node *createnode()
{
node* n=new node;
n->eow=false;
for(int i=0;i<26;i++)
{
n->child[i]=NULL;
}
return n;
}
void insertword(string s)
{
node *cur=root;
for(int i=0;i<s.size();i++)
{
int j=s[i]-'a';
if(cur->child[j]==NULL)
{
cur->child[j]=createnode();
}
cur=cur->child[j];
}
cur->eow=true;
}
void print(node *cur=root, string s="")
{
if(cur->eow==true)
{
cout<<s<<endl;
}
for(int i=0;i<26;i++)
{
if(cur->child[i]!=NULL)
{
char c=(i+'a');
print(cur->child[i],s+c);
}
}
}
int main()
{
root=createnode();
insertword("hello");
insertword("hel");
insertword("red");
insertword("green");
insertword("reddy");
print();
//delete node;
}
I2luY2x1ZGU8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZXsKICBib29sIGVvdzsKICBub2RlKiBjaGlsZFsyNl07Cn07Cm5vZGUgKnJvb3Q7Cm5vZGUgKmNyZWF0ZW5vZGUoKQp7CgogICAgbm9kZSogbj1uZXcgbm9kZTsKICAgIG4tPmVvdz1mYWxzZTsKICAgIGZvcihpbnQgaT0wO2k8MjY7aSsrKQogICAgewogICAgICAgIG4tPmNoaWxkW2ldPU5VTEw7CiAgICB9CiAgICByZXR1cm4gbjsKfQoKdm9pZCBpbnNlcnR3b3JkKHN0cmluZyBzKQp7CgogICAgbm9kZSAqY3VyPXJvb3Q7CiAgICBmb3IoaW50IGk9MDtpPHMuc2l6ZSgpO2krKykKICAgIHsKICAgICAgICBpbnQgaj1zW2ldLSdhJzsKCiAgICAgICAgaWYoY3VyLT5jaGlsZFtqXT09TlVMTCkKICAgICAgICB7CgogICAgICAgICAgICBjdXItPmNoaWxkW2pdPWNyZWF0ZW5vZGUoKTsKCiAgICAgICAgfQoKICAgICAgICBjdXI9Y3VyLT5jaGlsZFtqXTsKICAgIH0KICAgIGN1ci0+ZW93PXRydWU7Cn0Kdm9pZCBwcmludChub2RlICpjdXI9cm9vdCwgc3RyaW5nIHM9IiIpCnsKCiAgICBpZihjdXItPmVvdz09dHJ1ZSkKICAgIHsKICAgICAgICBjb3V0PDxzPDxlbmRsOwogICAgfQogICAgZm9yKGludCBpPTA7aTwyNjtpKyspCiAgICB7CgogICAgICAgIGlmKGN1ci0+Y2hpbGRbaV0hPU5VTEwpCiAgICAgICAgewogICAgICAgICAgICBjaGFyIGM9KGkrJ2EnKTsKCiAgICAgICAgICAgIHByaW50KGN1ci0+Y2hpbGRbaV0scytjKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgIHJvb3Q9Y3JlYXRlbm9kZSgpOwogICAgaW5zZXJ0d29yZCgiaGVsbG8iKTsKICAgIGluc2VydHdvcmQoImhlbCIpOwogICAgaW5zZXJ0d29yZCgicmVkIik7CiAgICBpbnNlcnR3b3JkKCJncmVlbiIpOwogICAgaW5zZXJ0d29yZCgicmVkZHkiKTsKICAgIHByaW50KCk7CiAgICAvL2RlbGV0ZSBub2RlOwp9Cg==