Cod sursa(job #1875044)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 10 februarie 2017 18:04:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie
{
    int nr, lv;
    Trie* v[26];
    Trie()
    {
        nr = 0; lv = 0;
        memset(v, 0, sizeof(v));
    }
} root;

void add(Trie* t, char* s)
{
    if(*s == 0) t->nr++;
    else
    {
        if(t->v[*s - 'a'] == 0)
        {
            t->v[*s - 'a'] = new Trie();
            t->lv++;
        }
        add(t->v[*s - 'a'], s + 1);
    }
}

void del(Trie* t, char* s)
{
    if(*s == 0)
        t->nr--;
    else
    {
        del(t->v[*s - 'a'], s + 1);
        if(t->v[*s - 'a']->nr == 0 && t->v[*s - 'a']->lv == 0)
        {
            delete t->v[*s - 'a'];
            t->v[*s - 'a'] = 0;
            t->lv--;
        }
    }
}

int q2(Trie* t, char* s)
{
    if(*s == 0) return t->nr;
    if(t->v[*s - 'a'] != 0)
        return q2(t->v[*s - 'a'], s + 1);
    return 0;
}

int q3(Trie* t, char* s, int k)
{
    if(*s == 0) return k;
    if(t->v[*s - 'a'] != 0)
        q3(t->v[*s - 'a'], s + 1, k + 1);
    else return k;
}

char cuv[22];
int com;

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    while(true)
    {
        scanf("%d %s", &com, cuv);
        if(feof(stdin))
            break;
        switch(com)
        {
        case 0:
            add(&root, cuv);
            break;
        case 1:
            del(&root, cuv);
            break;
        case 2:
            printf("%d\n", q2(&root, cuv));
            break;
        case 3:
            printf("%d\n", q3(&root, cuv, 0));
            break;
        }
    }
    return 0;
}