Cod sursa(job #2053019)

Utilizator leraValeria lera Data 31 octombrie 2017 12:30:29
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

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

typedef struct nod {struct nod *fiu[27];int terminal;int dus;int trecere;} NOD, *TRIE;
int best, i;
void adauga(TRIE &T, char *p)
{
    if(T == NULL)
    {
        T = new NOD;
        for(int i = 0; i <= 25; i++)
            T->fiu[i] = NULL;
        T -> trecere = 0;
        T -> dus = 0;
        adauga(T,p);
    }
    else
    {
        T -> dus = T -> dus + 1;
        if((*p) == '\0')
        {
            T -> trecere = (T -> trecere) + 1;
        }
        else adauga(T->fiu[(*p) - 'a'], p + 1);
    }
}
void sterge(TRIE &T, char *p)
{
    T -> dus = T -> dus - 1;
    if((*p) == '\0')
    {
        T -> trecere = (T -> trecere) - 1;
    }
    else sterge(T->fiu[(*p) - 'a'], p + 1);
}
void cauta(TRIE &T, char *p)
{
    if(T == NULL)
    {
        fout << 0 << '\n';
        return;
    }
    if((*p) == '\0')
    {
        fout << T -> trecere << '\n';
    }
    else cauta(T->fiu[(*p) - 'a'], p + 1);
}
void cautpr(TRIE &T, char *p)
{
    if(T == NULL)
    {
        fout << best - 1 << '\n';
        return;
    }
    if(T -> dus >= 1)best++;
    if((*p) == '\0')
    {
        fout << best - 1<< '\n';
    }
    else
        cautpr(T->fiu[(*p) - 'a'], p + 1);
}
char cuv[25];
int op;
TRIE T = NULL;
int main()
{
    while(fin >> op >> cuv)
    {
        i++;
        //cout << op <<" " << cuv << '\n';
        if(op == 0)
        {
            adauga(T, cuv);
        }
        else if(op == 1)
        {
            sterge(T, cuv);
        }
        else if(op == 2)
        {
            cauta(T, cuv);
        }
        else if(op == 3)
        {
            best = 0;
            cautpr(T, cuv);
        }
    }
    return 0;
}