#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<limits.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
typedef long long ll ;
// trie dictionnary
typedef struct Trienode{
char letter;
bool isword;
struct Trienode *children[26];
}Trienode;
Trienode *createTrienode(char c){
Trienode *to = (Trienode *)malloc(sizeof(Trienode));
to->letter=c;
to->isword=false;
for(int i=0;i<26;i++){
to->children[i]=NULL;
}
return to;
}
//1
Trienode *insertword(Trienode *root,char *word){
if(!root) root=createTrienode('\0');
if(!*word) return root;
char *ptr =word ;
Trienode *temp=root;
while(*ptr){
if(!temp->children[*ptr-'a']) temp->children[*ptr-'a']=createTrienode(*ptr);
temp=temp->children[*ptr-'a'];
ptr++;
}
temp->isword=true;
return root;
}
//2
bool search(Trienode *root , char *word){
if(!root) return false;
Trienode *temp=root;
char *ptr = word;
while(*ptr){
if(!temp->children[*ptr-'a']) return false;
temp=temp->children[*ptr-'a'];
ptr++;
}
return temp->isword;
}
//3
void dfs(Trienode *root,char *buffer,char *prefix,int depth){
if(!root) return;
if(root->isword){
buffer[depth]='\0';
if(strncmp(buffer,prefix,strlen(prefix))==0)
printf("%s\n",buffer);
}
for(int i=0;i<26;++i){
if(root->children[i]){
buffer[depth]='a'+i;
dfs(root->children[i],buffer,prefix,depth+1);
}
}
}
void show_all_words(Trienode *root,char *prefix){
char buffer[100];
dfs(root,buffer,prefix,0);
}
int main() {
Trienode *root = NULL;
// Insert words
root = insertword(root, "all");
root = insertword(root, "ally");
root = insertword(root, "bat");
root = insertword(root, "bath");
root = insertword(root, "ball");
root = insertword(root, "mehdi");
root = insertword(root, "mehdiisthebest");
printf("Words in trie:\n");
show_all_words(root,"ba");
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHRpbWUuaD4KI2luY2x1ZGU8bGltaXRzLmg+CiNpbmNsdWRlPG1hdGguaD4gCiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTxzdGRib29sLmg+CiAKdHlwZWRlZiBsb25nIGxvbmcgbGwgOyAKCiAgICAgIC8vIHRyaWUgZGljdGlvbm5hcnkKCiAgICAgdHlwZWRlZiBzdHJ1Y3QgVHJpZW5vZGV7CiAgICAgICAgY2hhciBsZXR0ZXI7CiAgICAgICAgYm9vbCBpc3dvcmQ7CiAgICAgICAgc3RydWN0IFRyaWVub2RlICpjaGlsZHJlblsyNl07ICAgICAgICAKICAgICB9VHJpZW5vZGU7IAoKICAgICBUcmllbm9kZSAqY3JlYXRlVHJpZW5vZGUoY2hhciBjKXsKICAgICAgICBUcmllbm9kZSAqdG8gPSAoVHJpZW5vZGUgKiltYWxsb2Moc2l6ZW9mKFRyaWVub2RlKSk7CiAgICAgICAgdG8tPmxldHRlcj1jOwogICAgICAgIHRvLT5pc3dvcmQ9ZmFsc2U7CiAgICAgICAgZm9yKGludCBpPTA7aTwyNjtpKyspewogICAgICAgICAgIHRvLT5jaGlsZHJlbltpXT1OVUxMOyAgICAgCiAgICAgICAgfQogICAgICAgIHJldHVybiB0bzsKICAgICB9CgogICAgIC8vMQogICAgIFRyaWVub2RlICppbnNlcnR3b3JkKFRyaWVub2RlICpyb290LGNoYXIgKndvcmQpewogICAgICAgIGlmKCFyb290KSByb290PWNyZWF0ZVRyaWVub2RlKCdcMCcpOwogICAgICAgIGlmKCEqd29yZCkgcmV0dXJuIHJvb3Q7CiAgICAgICAgY2hhciAqcHRyID13b3JkIDsKICAgICAgICBUcmllbm9kZSAqdGVtcD1yb290OwogICAgICAgIHdoaWxlKCpwdHIpewogICAgICAgICAgIGlmKCF0ZW1wLT5jaGlsZHJlblsqcHRyLSdhJ10pIHRlbXAtPmNoaWxkcmVuWypwdHItJ2EnXT1jcmVhdGVUcmllbm9kZSgqcHRyKTsKICAgICAgICAgICB0ZW1wPXRlbXAtPmNoaWxkcmVuWypwdHItJ2EnXTsKICAgICAgICAgICBwdHIrKzsgICAgIAogICAgICAgIH0KICAgICAgICB0ZW1wLT5pc3dvcmQ9dHJ1ZTsKICAgICAgICByZXR1cm4gcm9vdDsKICAgICB9CgogICAgIC8vMgogICAgIGJvb2wgc2VhcmNoKFRyaWVub2RlICpyb290ICwgY2hhciAqd29yZCl7CiAgICAgICAgaWYoIXJvb3QpIHJldHVybiBmYWxzZTsKICAgICAgICBUcmllbm9kZSAqdGVtcD1yb290OwogICAgICAgIGNoYXIgKnB0ciA9IHdvcmQ7CiAgICAgICAgd2hpbGUoKnB0cil7CiAgICAgICAgICAgaWYoIXRlbXAtPmNoaWxkcmVuWypwdHItJ2EnXSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIHRlbXA9dGVtcC0+Y2hpbGRyZW5bKnB0ci0nYSddOwogICAgICAgICAgIHB0cisrOyAgICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gdGVtcC0+aXN3b3JkOwogICAgIH0KCiAgICAgLy8zCiAgICAgIHZvaWQgZGZzKFRyaWVub2RlICpyb290LGNoYXIgKmJ1ZmZlcixjaGFyICpwcmVmaXgsaW50IGRlcHRoKXsKICAgICAgICBpZighcm9vdCkgcmV0dXJuOwogICAgICAgIGlmKHJvb3QtPmlzd29yZCl7ICAgICAKICAgICAgICAgICBidWZmZXJbZGVwdGhdPSdcMCc7CiAgICAgICAgICAgaWYoc3RybmNtcChidWZmZXIscHJlZml4LHN0cmxlbihwcmVmaXgpKT09MCkKICAgICAgICAgICAgcHJpbnRmKCIlc1xuIixidWZmZXIpOwogICAgICAgIH0KICAgICAgICBmb3IoaW50IGk9MDtpPDI2OysraSl7CiAgICAgICAgICAgaWYocm9vdC0+Y2hpbGRyZW5baV0pewogICAgICAgICAgICAgICAgYnVmZmVyW2RlcHRoXT0nYScraTsKICAgICAgICAgICAgICAgIGRmcyhyb290LT5jaGlsZHJlbltpXSxidWZmZXIscHJlZml4LGRlcHRoKzEpOwogICAgICAgICAgIH0gICAgIAogICAgICAgIH0KICAgICB9CgogICAgIHZvaWQgc2hvd19hbGxfd29yZHMoVHJpZW5vZGUgKnJvb3QsY2hhciAqcHJlZml4KXsKICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOwogICAgICAgIGRmcyhyb290LGJ1ZmZlcixwcmVmaXgsMCk7CiAgICAgfQoKICAgIGludCBtYWluKCkgewogICAgVHJpZW5vZGUgKnJvb3QgPSBOVUxMOwoKICAgIC8vIEluc2VydCB3b3JkcwogICAgcm9vdCA9IGluc2VydHdvcmQocm9vdCwgImFsbCIpOwogICAgcm9vdCA9IGluc2VydHdvcmQocm9vdCwgImFsbHkiKTsKICAgIHJvb3QgPSBpbnNlcnR3b3JkKHJvb3QsICJiYXQiKTsKICAgIHJvb3QgPSBpbnNlcnR3b3JkKHJvb3QsICJiYXRoIik7CiAgICByb290ID0gaW5zZXJ0d29yZChyb290LCAiYmFsbCIpOwogICAgcm9vdCA9IGluc2VydHdvcmQocm9vdCwgIm1laGRpIik7CiAgICByb290ID0gaW5zZXJ0d29yZChyb290LCAibWVoZGlpc3RoZWJlc3QiKTsKCiAgICBwcmludGYoIldvcmRzIGluIHRyaWU6XG4iKTsKICAgIHNob3dfYWxsX3dvcmRzKHJvb3QsImJhIik7CgogICAgcmV0dXJuIDA7Cn0KCgoKCg==