Cod sursa(job #1875071)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 10 februarie 2017 18:23:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 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 != '\n')
    {
        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 == '\n')
        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 != '\n')
    {
        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 != '\n')
    {
        if(t->v[*s - 'a'] == 0)
            return k;
        t = t->v[*s - 'a'];
        s++;
        k++;
    }
    return k;
}

char cuv[32];

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    root = &v[0];
    fgets(cuv, 30, stdin);
    while(!feof(stdin))
    {
        switch(cuv[0])
        {
        case '0':
            add(root, cuv + 2);
            break;
        case '1':
            del(root, cuv + 2);
            break;
        case '2':
            printf("%d\n", q2(root, cuv + 2));
            break;
        case '3':
            printf("%d\n", q3(root, cuv + 2, 0));
            break;
        }
        fgets(cuv, 30, stdin);
    }
    return 0;
}