Cod sursa(job #2075054)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 25 noiembrie 2017 11:06:44
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>

using namespace std;

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

char cuv[25];

int cvt(char c)
{
    return (int)c-(int)'a';
}

struct nod
{
    int cnt;
    int nr_fii;
    nod *son[27];
    nod()
    {
        for(int i=0; i<27; ++i)
            son[i] = NULL;

        cnt = nr_fii = 0;
    }
};

nod *root = new nod();

void add(nod *crt, int ind)
{
    if(cuv[ind] == '\0')
    {
        crt -> cnt ++;
        return;
    }

    if(crt->son[cuv[ind]-'a'] == NULL)
       {
           crt->son[cuv[ind] - 'a'] = new nod;
           crt->nr_fii++;
       }

    add(crt->son[cuv[ind] - 'a'], ind+1);
}

void del(nod *crt, int ind)
{
    if(cuv[ind] == '\0')
    {
       crt -> cnt--;
       return;
    }

    del(crt->son[cuv[ind] - 'a'], ind+1);

    if(crt->son[cuv[ind] - 'a']->cnt == 0 &&
       crt->son[cuv[ind] - 'a']->nr_fii == 0)
    {
        delete crt->son[cuv[ind] - 'a'];
        crt->son[cuv[ind] - 'a'] = 0;
        crt->nr_fii--;
    }
}

int cnt(nod *crt, int ind)
{
    if(cuv[ind] == '\0')
        return crt->cnt;

    if(crt->son[cuv[ind] - 'a'] == NULL)
    {
        return 0;
    }

    return cnt(crt->son[cuv[ind] - 'a'], ind+1);
}

int prefix(nod *crt, int ind)
{
    if(crt == NULL)
    {
        return ind-1;
    }

    return prefix(crt->son[cuv[ind]-'a'], ind+1);
}


void ReadSolve()
{
    int op;

    while(fin >> op >> cuv)
    {
        if(op == 0)
        {
            add(root, 0);
        }

        else if(op == 1)
        {
            del(root, 0);
        }

        else if(op == 2)
        {
            fout << cnt(root, 0) << "\n";
        }

        else if(op == 3)
        {
            fout << prefix(root, 0) << "\n";
        }
    }
}

int main()
{
    ReadSolve();
    return 0;
}