#include<iostream>
#include <string>
using namespace std;
struct SuffixTreeNode{
char c;
SuffixTreeNode* one;
SuffixTreeNode* two;
SuffixTreeNode* three;
SuffixTreeNode* four;
SuffixTreeNode(char c=0) : c(c), one(nullptr), two(nullptr), three(nullptr), four(nullptr) { }
};
SuffixTreeNode* Insert(SuffixTreeNode* root,char ch){
if (! root){
root=new SuffixTreeNode(ch);
}
else if(ch=='a'){
root->one=Insert(root->one,ch);
}
else if(ch=='c'){
root->two=Insert(root->two,ch);
}
else if(ch=='g'){
root->three=Insert(root->three,ch);
}
else if(ch=='t') {
root->four=Insert(root->four,ch);
}
return root;
}
bool Search(SuffixTreeNode* root, int data){
cout << (char)data<<"=="<<root->c<<"?"<<endl;
if(!root) return false;
else if (root->c==data) return true;
else if (data=='a')return Search(root->one,data);
else if (data=='c')return Search(root->two,data);
else if (data=='g')return Search(root->three,data);
else return Search(root->four,data);
}
void Print(SuffixTreeNode* root, int x=0){
for (int i=0; i<x; i++) cout<<" ";
if(!root) cout <<"X"<<endl;
else {
cout << root->c <<endl;
Print (root->one, x+2);
Print(root->two,x+2);
Print(root->three,x+2);
Print(root->four,x+2);
}
}
int main(){
SuffixTreeNode* root=nullptr;
char str;
root=Insert(root,'a');
root=Insert(root,'c');
root=Insert(root,'c');
root=Insert(root,'t');
root=Insert(root,'a');
root=Insert(root,'g');
cout<<"Enter character to be searched\n";
cin>>str;
cout << "Searching "<<str<<" in:"<<endl;
Print (root);
if(Search(root,str))
cout<<"Found\n";
else cout<<"Not found\n";
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgU3VmZml4VHJlZU5vZGV7CiAgICBjaGFyIGM7CiAgICBTdWZmaXhUcmVlTm9kZSogb25lOwogICAgU3VmZml4VHJlZU5vZGUqIHR3bzsKICAgIFN1ZmZpeFRyZWVOb2RlKiB0aHJlZTsKICAgIFN1ZmZpeFRyZWVOb2RlKiBmb3VyOwogICAgU3VmZml4VHJlZU5vZGUoY2hhciBjPTApIDogYyhjKSwgb25lKG51bGxwdHIpLCB0d28obnVsbHB0ciksIHRocmVlKG51bGxwdHIpLCBmb3VyKG51bGxwdHIpIHsgfQp9OwoKU3VmZml4VHJlZU5vZGUqIEluc2VydChTdWZmaXhUcmVlTm9kZSogcm9vdCxjaGFyIGNoKXsKICAgIGlmICghIHJvb3QpewogICAgICAgIHJvb3Q9bmV3IFN1ZmZpeFRyZWVOb2RlKGNoKTsKICAgIH0KICAgIGVsc2UgaWYoY2g9PSdhJyl7CiAgICAgICAgcm9vdC0+b25lPUluc2VydChyb290LT5vbmUsY2gpOwogICAgfQogICAgZWxzZSBpZihjaD09J2MnKXsKICAgICAgICByb290LT50d289SW5zZXJ0KHJvb3QtPnR3byxjaCk7CiAgICB9CiAgICBlbHNlIGlmKGNoPT0nZycpewogICAgICAgIHJvb3QtPnRocmVlPUluc2VydChyb290LT50aHJlZSxjaCk7CiAgICB9CiAgICBlbHNlIGlmKGNoPT0ndCcpIHsKICAgICAgICByb290LT5mb3VyPUluc2VydChyb290LT5mb3VyLGNoKTsKICAgIH0KCiAgICByZXR1cm4gcm9vdDsKfQoKYm9vbCBTZWFyY2goU3VmZml4VHJlZU5vZGUqIHJvb3QsIGludCBkYXRhKXsKCWNvdXQgPDwgKGNoYXIpZGF0YTw8Ij09Ijw8cm9vdC0+Yzw8Ij8iPDxlbmRsOyAKICAgIGlmKCFyb290KSByZXR1cm4gZmFsc2U7CiAgICBlbHNlIGlmIChyb290LT5jPT1kYXRhKSByZXR1cm4gdHJ1ZTsKICAgIGVsc2UgaWYgKGRhdGE9PSdhJylyZXR1cm4gU2VhcmNoKHJvb3QtPm9uZSxkYXRhKTsKICAgIGVsc2UgaWYgKGRhdGE9PSdjJylyZXR1cm4gU2VhcmNoKHJvb3QtPnR3byxkYXRhKTsKICAgIGVsc2UgaWYgKGRhdGE9PSdnJylyZXR1cm4gU2VhcmNoKHJvb3QtPnRocmVlLGRhdGEpOwogICAgZWxzZSByZXR1cm4gU2VhcmNoKHJvb3QtPmZvdXIsZGF0YSk7Cn0KCgp2b2lkIFByaW50KFN1ZmZpeFRyZWVOb2RlKiByb290LCBpbnQgeD0wKXsKCWZvciAoaW50IGk9MDsgaTx4OyBpKyspIGNvdXQ8PCIgIjsKICAgIGlmKCFyb290KSBjb3V0IDw8IlgiPDxlbmRsOyAKICAgIGVsc2UgewogICAgCWNvdXQgPDwgcm9vdC0+YyA8PGVuZGw7IAogICAgICAgIFByaW50IChyb290LT5vbmUsIHgrMik7CiAgICAJUHJpbnQocm9vdC0+dHdvLHgrMik7CiAgICAJUHJpbnQocm9vdC0+dGhyZWUseCsyKTsKICAgIAlQcmludChyb290LT5mb3VyLHgrMik7CiAgICB9Cn0KCmludCBtYWluKCl7CiAgICBTdWZmaXhUcmVlTm9kZSogcm9vdD1udWxscHRyOwogICAgY2hhciBzdHI7CiAgICByb290PUluc2VydChyb290LCdhJyk7CiAgICByb290PUluc2VydChyb290LCdjJyk7CiAgICByb290PUluc2VydChyb290LCdjJyk7CiAgICByb290PUluc2VydChyb290LCd0Jyk7CiAgICByb290PUluc2VydChyb290LCdhJyk7CiAgICByb290PUluc2VydChyb290LCdnJyk7CiAgICBjb3V0PDwiRW50ZXIgY2hhcmFjdGVyIHRvIGJlIHNlYXJjaGVkXG4iOwogICAgY2luPj5zdHI7CgogICAgY291dCA8PCAiU2VhcmNoaW5nICI8PHN0cjw8IiBpbjoiPDxlbmRsOwogICAgUHJpbnQgKHJvb3QpOyAKICAgIGlmKFNlYXJjaChyb290LHN0cikpIAogICAgICAgY291dDw8IkZvdW5kXG4iOwogICAgZWxzZSBjb3V0PDwiTm90IGZvdW5kXG4iOwp9Cg==