Cod sursa(job #2049508)

Utilizator FredyLup Lucia Fredy Data 27 octombrie 2017 12:18:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define lim 26
struct trie
{
    int nr=0, nrfii=0;
    trie *fiu[lim]={0};
} *T;

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


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


int nr_aparitii (char *cuv, trie *nod)
{
    if (cuv[0]==0)
        return nod->nr;
    int x = cuv[0] - 'a';
    if (nod->fiu[x]==0)
        return 0;
    nr_aparitii (cuv+1, nod->fiu[x]);
}


int lpref_maxim (char *cuv, trie *nod)
{
    if (cuv[0]==0)
        return 0;
    int x = cuv[0] - 'a';
    if (nod->fiu[x]==0)
        return 0;
    return 1 + lpref_maxim (cuv+1, nod->fiu[x]);
}


int main()
{
    int tip;
    char cuv[30];
    T = new trie;
    while (fin>>tip)
    {
        fin>>cuv;
        if (tip==0) adauga (cuv, T);
        if (tip==1) sterge (cuv, T);
        if (tip==2) fout<<nr_aparitii (cuv, T)<<'\n';
        if (tip==3) fout<<lpref_maxim (cuv, T)<<'\n';
    }

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