Cod sursa(job #2261882)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 16 octombrie 2018 19:39:13
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

#define CH (*s - 'a')

using namespace std;

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

struct Trie
{
    int pr;
    Trie *fii[26];
};

Trie *T= new Trie;

void adaug(Trie *p, char *s)
{
    p -> pr++;
    if(*s != '\0')
    {
        if(p->fii[CH] == NULL)
        {
            p->fii[CH] = new Trie();
        }
        adaug(p->fii[CH], s + 1);
    }
}

int elim( Trie *p, char *s)
{
    p->pr--;
    if(*s != '\0')
    {
        elim(p->fii[CH], s + 1);
    }
}

int apar(Trie *p, char *s)
{
    if(*s != '\0')
    {
        if(p->fii[CH] == NULL)
        {
            return 0;
        }
        else
        {
            return apar(p->fii[CH], s + 1);
        }
    }
    else
    {
        int res = p->pr;
        for(int i = 0; i < 26; i++)
        {
            if(p->fii[i] != NULL)
            {
                res -= p->fii[i]->pr;
            }
        }
        return res;
    }
}

int prefix(Trie *p, char *s, int k)
{
    if(*s == '\0')
    {
        return k;
    }
    else
    {
        if(p->fii[CH] != NULL && 0 < p->fii[CH]->pr)
        {
            return prefix(p->fii[CH], s + 1, k + 1);
        }
        else
        {
            return k;
        }
    }
}

int main()
{
    char s[32];
    while(fin.getline(s, 31))
    {
        switch (s[0])
        {
        case '0':
            adaug(T,s+2);
            break;
        case '1':
            elim(T,s+2);
            break;
        case '2':
            fout<<apar(T,s+2)<<'\n';
            break;
        case '3':
            fout<<prefix(T,s+2,0)<<'\n';
            break;
        }
    }
    return 0;
}