Cod sursa(job #1974413)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 aprilie 2017 16:23:47
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>

using namespace std;
#define lit (*p - 'a')

class Trie{
public:
    Trie* fii[26];
    int nrf;
    int cuv;
    Trie(){
        nrf = 0;
        cuv = 0;
        for(int i = 0; i < 26; ++i)
            fii[i] = 0;
    }
    void insert(char *p) {
        if(*p == 0) {
            ++cuv;
            return;
        }
        if(fii[lit] == 0) {
            nrf += 1;
            fii[lit] = new Trie;
        }
        fii[lit]-> insert(p + 1);
    }

    void erase(char *p) {
        if(*p == 0) {
            cuv--;
            return;
        }
        fii[lit]->erase(p + 1);
        if(fii[lit]->nrf == 0 && fii[lit]->cuv == 0) {
            delete fii[lit];
            --nrf;
            fii[lit] = 0;
        }

    }

    int prefix(char *p) {
        if(*p == 0 || fii[lit] == 0)
            return 0;
        return 1 + fii[lit]->prefix(p + 1);

    }
    int count(char *p) {
        if(*p == 0)
            return cuv;
        if(fii[lit] == 0)
            return 0;
        return fii[lit]->count(p + 1);
    }


}trie;

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);


    int t;
    char w[30];
    while(scanf("%d%s", &t, w) == 2) {
        if(t == 0)
            trie.insert(w);
        else
            if(t == 1)
                trie.erase(w);
            else
                if(t == 2)
                    printf("%d\n", trie.count(w));
                else
                    printf("%d\n", trie.prefix(w));
    }

    return 0;
}