Cod sursa(job #2416366)

Utilizator GoogalAbabei Daniel Googal Data 27 aprilie 2019 14:13:33
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>

#define CH (*s - 'a')

using namespace std;

ifstream in("trie.in");
ofstream out("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);
    }
}

void del(Trie *p, char *s)
{
    p->pr--;

    if(*s != '\0')
        del(p->fii[CH], s + 1);
}

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

int main()
{
    char s[32];

    while(in.getline(s, 31))
    {
        if(s[0] == '0')
            adaug(t, s + 2);
        else if(s[0] == '1')
            del(t, s + 2);
        else if(s[0] == '2')
            out << appars(t, s + 2) << '\n';
        else if(s[0] == '3')
            out << prefix(t, s + 2, 0) << '\n';
    }

    in.close();
    out.close();

    return 0;
}