Cod sursa(job #1875062)

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

using namespace std;

struct Trie
{
    int nr, lv;
    Trie* v[26];
} v[200001 * 26], *root;
int lv = 1;

void add(Trie* t, char* s)
{
    while(*s)
    {
        if(t->v[*s - 'a'] == 0)
        {
            t->v[*s - 'a'] = &v[lv++];
            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)
        {
            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);
    root = &v[0];
    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;
}