Cod sursa(job #2217919)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 2 iulie 2018 16:48:29
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <cstring>

using namespace std;

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

struct Trie
{
    int cnt, nrfii;
    Trie *fiu[26];
//
    Trie()
    {
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie *T = new Trie;

void insert(Trie *nod, char *s)
{
    if(*s == NULL)
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[*s - 'a'] == 0)
    {
        nod->fiu[*s - 'a'] = new Trie;
        nod->nrfii++;
    }
    insert(nod->fiu[*s - 'a'], s + 1);
}
bool erase(Trie *nod, char *s)
{
    if(*s == NULL)
        nod->cnt--;
    else if(erase(nod->fiu[*s - 'a'], s + 1))
    {
        nod->fiu[*s - 'a'] = 0;
        nod->nrfii--;
    }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
    {
        delete nod;
        return true;
    }
    return false;
}
int fr(Trie *nod, char *s)
{
    if(*s == NULL)
        return nod->cnt;
    if(nod->fiu[*s - 'a'])
        return fr(nod->fiu[*s - 'a'], s + 1);
    return 0;
}
int prefix(Trie *nod, char *s, int k)
{
    if(*s == NULL || nod->fiu[*s - 'a'] == 0)
        return k;
    return prefix(nod->fiu[*s - 'a'], s + 1, k + 1);
}

int main()
{
    int op;
    char word[21];
    while(in >> op >> word)
    {
        switch(op)
        {
        case 0:
            insert(T, word);
            break;
        case 1:
            erase(T, word);
            break;
        case 2:
            out << fr(T, word) << '\n';
            break;
        case 3:
            out << prefix(T, word, 0) << '\n';
            break;
        }
    }
    return 0;
}