Cod sursa(job #2227560)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 1 august 2018 02:58:05
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

class Trie{
public:
    Trie *fii[26];
    int nrf;
    int nrap;

    Trie() {
        memset(fii, 0, sizeof(fii));
        nrf = nrap = 0;
    }

    void insert(char *c)
    {
        if (*c == 0) {
            ++nrap;
            return;
        }
        if (fii[*c - 'a'] == 0) {
            fii[*c - 'a'] = new Trie();
            ++nrf;
        }
        fii[*c - 'a']->insert(c + 1);
    }
    void erase(char *c)
    {
        if (*c == 0) {
            --nrap;
            return;
        }
        if (fii[*c - 'a'] == 0)
            return;

        fii[*c - 'a']->erase(c + 1);

        if (fii[*c -'a']->nrf == 0) {
            --nrf;
            delete fii[*c - 'a'];
            fii[*c - 'a'] = 0;
        }
    }

    int count(char *c)
    {
        if (*c == 0)
            return nrap;
        if (fii[*c - 'a'] == 0)
            return 0;
        return fii[*c - 'a']->count(c + 1);
    }
    int prefix(char *c)
    {
        if (*c == 0)
            return 0;
        if (fii[*c - 'a'] == 0)
            return 0;
        return 1 + fii[*c - 'a']->prefix(c + 1);
    }

};

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

    int op;
    char s[30];
    Trie trie;
    while(scanf("%d %s", &op, &s) == 2)
    {
        switch(op) {
            case 0: {trie.insert(s); break;}
            case 1: {trie.erase(s); break;}
            case 2: {printf("%d\n", trie.count(s)); break;}
            case 3: {printf("%d\n", trie.prefix(s)); break;}
            default: assert(1 == 0 && "Shouldn't have happened");
        }
    }

    return 0;
}