Cod sursa(job #1810135)

Utilizator grimmerFlorescu Luca grimmer Data 19 noiembrie 2016 17:14:00
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <cstring>
#include <string>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie {
    int cnt, nr_sons;
    Trie *children[ 26 ];

    Trie() {
        cnt = nr_sons = 0;
        memset( children, 0, sizeof( children ) );
    }
};

Trie *T = new Trie;

void ins(Trie *node, char *w){
    if(!*w){
        ++node->cnt;
        return;
    }

    int pos = *w - 'a';

    if(node->children[pos] == 0){
        node->children[pos] = new Trie;
        ++node->nr_sons;
    }

    ins(node->children[pos], w + 1);
}

int del(Trie *node, char *w){
    int pos = *w - 'a';

    if(!*w){
        --node->cnt;
    }
    else if(del(node->children[pos], w + 1) == 1){
            --node->nr_sons;
            node->children[pos] = 0;
        }

    if(node->cnt == 0 && node->nr_sons == 0){
        delete node;
        return 1;
    }

    return 0;
}

int Query(Trie *node, char *w){
    if(!*w){
        return node->cnt;
    }

    int pos = *w - 'a';

    Query(node->children[pos], w + 1);
}

int Comm(Trie *node, char *w, int k){
    int pos = *w - 'a';

    if(!*w || node->children[pos] == 0){
        return k;
    }

    Comm(node->children[pos], w + 1, k + 1);
}

int main() {

    char s[27];
    int op;

    while(fin>> op >> s){
        if(op == 0){
            ins(T, s);
        }
        if(op == 1){
            del(T, s);
        }
        if(op == 2){
            fout<< Query(T, s) << '\n';
        }
        if(op == 3){
            fout<< Comm(T, s, 0) << '\n';
        }
    }
    return 0;
}