Cod sursa(job #1894636)

Utilizator Emy1337Micu Emerson Emy1337 Data 27 februarie 2017 00:31:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;

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


struct trie
{
    int nr_fii = 0;
    int nr_cuv = 0;
    trie *fiu[26] = {0};

} *T;


void add(trie *nod, char cuv[])
{
    if(cuv[0] == NULL)
    {
        nod->nr_cuv++;
        return;
    }

    if(nod->fiu[cuv[0] - 'a'] == NULL)
    {
        nod->fiu[cuv[0] - 'a'] = new trie;
        nod->nr_fii++;
    }
    add(nod->fiu[cuv[0] - 'a'], cuv + 1);
}



void sterge(trie *nod, char cuv[])
{
    if(cuv[0] == NULL)
    {
        nod->nr_cuv--;
    }
    else
    {
        sterge(nod->fiu[cuv[0] - 'a'], cuv + 1);
        if(nod->fiu[cuv[0] - 'a']->nr_fii == 0 && nod->fiu[cuv[0] - 'a']->nr_cuv == 0)
        {
            nod->nr_fii--;
            delete nod->fiu[cuv[0] - 'a'];
            nod->fiu[cuv[0] - 'a'] = NULL;
        }
    }
}


int cate(trie *nod, char cuv[])
{
    if(cuv[0] == NULL)
        return nod->nr_cuv;

    if(nod->fiu[cuv[0] - 'a'] == NULL)
        return 0;

    return cate(nod->fiu[cuv[0] - 'a'], cuv + 1);
}


int prefix(trie *nod, char cuv[])
{

    if(cuv[0] == NULL)
        return 0;

    if(nod->fiu[cuv[0] - 'a'] == NULL)
        return 0;

    return prefix(nod->fiu[cuv[0] - 'a'], cuv + 1) + 1;
}


int  main()
{
    int q;
    char cuvant[25];
    T = new trie;

    while(fin >> q)
    {
        fin >> cuvant;

        if(q == 0)
            add(T, cuvant);
        if(q == 1)
            sterge(T, cuvant);
        if(q == 2)
            fout << cate(T, cuvant) << '\n';
        if(q == 3)
            fout << prefix(T, cuvant) << '\n';
    }

    return 0;
}