Cod sursa(job #1875050)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 10 februarie 2017 18:09:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 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)
{
    while(*s)
    {
        if(t->v[*s - 'a'] == 0)
        {
            t->v[*s - 'a'] = new Trie();
            t->lv++;
        }
        t = t->v[*s - 'a'];
        s++;
    }
    t->nr++;
}

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)
{
    while(*s)
    {
        if(t->v[*s - 'a'] == 0)
            return 0;
        t = t->v[*s - 'a'];
        s++;
    }
    return t->nr;
}

int q3(Trie* t, char* s, int k)
{
    while(*s)
    {
        if(t->v[*s - 'a'] == 0)
            return k;
        t = t->v[*s - 'a'];
        s++;
        k++;
    }
    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;
}