Cod sursa(job #1522416)

Utilizator sebinechitasebi nechita sebinechita Data 11 noiembrie 2015 18:12:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
#define cout fout
struct trie{
    int fii = 0;
    trie *fiu[26] = {0};
    int nr = 0;
} *R;

void add(trie *nod, char cuv[])
{
    if(cuv[0] == 0)
    {
        nod->nr++;
        return;
    }
    if(nod->fiu[cuv[0] - 'a'] == 0)
    {
        nod->fii++;
        nod->fiu[cuv[0] - 'a'] = new trie;
    }
    add(nod->fiu[cuv[0] - 'a'], cuv + 1);
}

void sterge(trie *nod, char cuv[])
{
    if(cuv[0] == 0)
        nod->nr--;
    else
    {
        sterge(nod->fiu[cuv[0] - 'a'], cuv + 1);
        if(nod->fiu[cuv[0] - 'a']->fii == 0 && nod->fiu[cuv[0] - 'a']->nr == 0)
        {
            delete nod->fiu[cuv[0] - 'a'];
            nod->fiu[cuv[0] - 'a'] = 0;
            nod->fii--;
        }
    }
    return;
}
int nr_ap(trie *nod, char cuv[])
{
    if(cuv[0] == 0)
        return nod->nr;
    if(nod->fiu[cuv[0] - 'a'] == 0)
        return 0;
    return nr_ap(nod->fiu[cuv[0] - 'a'], cuv + 1);
}
int prefix(trie *nod, char cuv[])
{
    if(cuv[0] == 0)
        return 0;
    if(!nod->fiu[cuv[0] - 'a'])
        return 0;
    return 1 + prefix(nod->fiu[cuv[0] - 'a'], cuv + 1);
}

int main()
{
    int t;
    char cuv[30];
    R = new trie;
    while(fin >> t)
    {
        fin >> cuv;
        if(t == 0)
        {
            add(R, cuv);
        }
        if(t == 1)
        {
            sterge(R, cuv);
        }
        if(t == 2)
        {
            cout << nr_ap(R, cuv) << "\n";
        }
        if(t == 3)
        {
            cout << prefix(R, cuv) << "\n";
        }
    }
}