Cod sursa(job #2032844)

Utilizator rangal3Tudor Anastasiei rangal3 Data 5 octombrie 2017 19:37:33
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#define in "trie.in"
#define out "trie.out"
#define LG 23
#define ALF 30

using namespace std;

ifstream fin(in);
ofstream fout(out);

struct Trie{
    int nrf,cnt;
    Trie *fii[ALF];

    Trie()
    {
        nrf = cnt = 0;
        for(int i=0; i<ALF; ++i)
            fii[i] = NULL;
    }
};

char s[LG],*p;
int op;

Trie *f = new Trie;

inline void adauga(Trie *nod)
{
    if(*p == '\0')
    {
        (nod->cnt)++;
        return;
    }

    int ch = *p - 'a';

    if(nod->fii[ch] == NULL)
    {
        nod->fii[ch] = new Trie;
        (nod->nrf)++;
    }

    ++p;
    adauga(nod->fii[ch]);
}

inline bool sterge(Trie *nod)
{
    int ch = *p - 'a';
    if(*p == '\0')
    {
        -- nod->cnt;
    }
    else{
        ++p;
        if(sterge(nod->fii[ch]) == 1)
        {
            nod -> fii[ch] = NULL;
            -- nod -> nrf;
        }
    }


    if(nod->cnt == 0 && nod->nrf == 0 && nod != f){
            delete nod;
            return 1;
    }
    return 0;

}

inline int aparitii(Trie *nod)
{
    if(*p == '\0')
        return nod -> cnt;

    int ch = *p - 'a';
    ++p;

    if(nod -> fii[ch] == NULL) return 0;
    return aparitii(nod -> fii[ch]);
}

inline int prefix(Trie *nod)
{
    if(*p == '\0') return 0;

    int ch = *p - 'a';

    ++p;

    if(nod -> fii[ch] == NULL) return 0;
    return 1 + prefix(nod -> fii[ch]);
}

int main()
{
    while(fin>>op)
    {
        fin>>s;
        p = s;

        if(op == 0)
            adauga(f);
        else if(op == 1)
            sterge(f);
        else if(op == 2)
            fout<<aparitii(f)<<"\n";
        else
            fout<<prefix(f)<<"\n";
    }

    fin.close(); fout.close();
    return 0;
}