#include<iostream>
#include <vector>
using namespace std;
const int alpha=26;
class trie {
private:
struct node{
vector<node*> child;
bool end;
int countchild;
// initialization should be in the class/struct constructor
node () : child(alpha,nullptr), end(false), countchild(0) { }
};
node* root;
void show(node* n, int inc) {
cout<< string(inc, ' ')<<(n->end?"(END)":"()")<<" children:"<<n->countchild<<endl;
for (int i=0; i<alpha; i++)
if (n->child[i]) {
cout << string(inc, ' ') << (char)('a'+i)<<": "<<endl;
show (n->child[i], inc+2);
}
}
public:
trie() {
root = new node;
}
~trie() {
//TODO rule of 3
}
trie& operator= (trie) = delete; //TODO rule of 3
void insert(string key){
node* pcrawl=root;
for(auto c:key){
int index=tolower(c)-'a';
if (index<0 || index>=alpha)
continue;
if(!pcrawl->child[index]){
pcrawl->child[index]=new node;
}
pcrawl->countchild+=1;
pcrawl=pcrawl->child[index];
}
pcrawl->end=true;
}
void show() {
show(root,0);
}
};
int main() {
trie t;
t.insert ("tester");
t.insert ("test");
t.insert ("TERM");
t.insert ("T.;0C");
t.show();
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBhbHBoYT0yNjsKCmNsYXNzIHRyaWUgewoJCnByaXZhdGU6IAoKCXN0cnVjdCBub2RlewoJCXZlY3Rvcjxub2RlKj4gY2hpbGQ7CgkJYm9vbCBlbmQ7CgkJaW50IGNvdW50Y2hpbGQ7CgkJCSAgLy8gaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGluIHRoZSBjbGFzcy9zdHJ1Y3QgY29uc3RydWN0b3IJCglub2RlICgpIDogY2hpbGQoYWxwaGEsbnVsbHB0ciksIGVuZChmYWxzZSksIGNvdW50Y2hpbGQoMCkgeyB9Cgl9OwoKCW5vZGUqIHJvb3Q7ICAKCgl2b2lkIHNob3cobm9kZSogbiwgIGludCBpbmMpIHsKCQljb3V0PDwgc3RyaW5nKGluYywgJyAnKTw8KG4tPmVuZD8iKEVORCkiOiIoKSIpPDwiIGNoaWxkcmVuOiI8PG4tPmNvdW50Y2hpbGQ8PGVuZGw7IAoJCWZvciAoaW50IGk9MDsgaTxhbHBoYTsgaSsrKSAKCSAgICBpZiAobi0+Y2hpbGRbaV0pIHsKCSAgICAJY291dCA8PCBzdHJpbmcoaW5jLCAnICcpIDw8IChjaGFyKSgnYScraSk8PCI6ICI8PGVuZGw7IAoJICAgIAlzaG93IChuLT5jaGlsZFtpXSwgaW5jKzIpOwoJICAgIH0KCX0KCnB1YmxpYzogIAogICAgdHJpZSgpIHsKICAgIAlyb290ID0gbmV3IG5vZGU7IAogICAgfQogICAgCgl+dHJpZSgpIHsKCS8vVE9ETyBydWxlIG9mIDMJCgl9CgkKCXRyaWUmIG9wZXJhdG9yPSAodHJpZSkgPSBkZWxldGU7ICAvL1RPRE8gcnVsZSBvZiAzCgkKCXZvaWQgaW5zZXJ0KHN0cmluZyBrZXkpewogICAgCW5vZGUqIHBjcmF3bD1yb290OwogICAgCWZvcihhdXRvIGM6a2V5KXsKICAgICAgICAJaW50IGluZGV4PXRvbG93ZXIoYyktJ2EnOwogICAgICAgIAlpZiAoaW5kZXg8MCB8fCBpbmRleD49YWxwaGEpCiAgICAgICAgCQljb250aW51ZTsgIAogICAgICAgIAlpZighcGNyYXdsLT5jaGlsZFtpbmRleF0pewogICAgICAgICAgICAJcGNyYXdsLT5jaGlsZFtpbmRleF09bmV3IG5vZGU7IAogICAgICAgIAl9CiAgICAgICAgCXBjcmF3bC0+Y291bnRjaGlsZCs9MTsKICAgICAgICAJcGNyYXdsPXBjcmF3bC0+Y2hpbGRbaW5kZXhdOwogICAgICAgIAogICAgCX0KICAgIAlwY3Jhd2wtPmVuZD10cnVlOwoJfQoKICAgIHZvaWQgc2hvdygpIHsKICAgIAlzaG93KHJvb3QsMCk7IAogICAgfQp9OyAKCmludCBtYWluKCkgewoJdHJpZSB0OwoJdC5pbnNlcnQgKCJ0ZXN0ZXIiKTsKCXQuaW5zZXJ0ICgidGVzdCIpOwoJdC5pbnNlcnQgKCJURVJNIik7Cgl0Lmluc2VydCAoIlQuOzBDIik7IAogICAgdC5zaG93KCk7IAkKfQ==