Cod sursa(job #2053027)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 31 octombrie 2017 12:40:16
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
typedef struct nod{
    struct nod *fiu[26]; int terminal, nrf;

} NOD, *TRIE;
TRIE T = NULL;
int v, maxim;
char cuv[25], *p1;
void adauga(TRIE &T, char *p)
{
    if(T == 0)
    {
        T = new NOD;
        for(int i = 0; i <= 25; ++i)T->fiu[i] = 0;
        T->nrf = 0;
        T->terminal = 0;
        adauga(T, p);
    }
    else
    {
        T->nrf++;
        if(*p == '\0')T->terminal ++;
        else adauga(T->fiu[*p - 'a'], p + 1);
    }
}
bool sterge(TRIE &T, char *p)
{
    int x = *p - 'a';
    if(*p == '\0')
        T -> terminal--;
    else if(sterge(T->fiu[x], p + 1))
    {
        T->fiu[x] = 0;
        T->nrf--;
    }
    if(T->nrf == 0 &&  T->terminal == 0)
    {
        delete(T);
        return 1;
    }
    return 0;
}
int nrapr(TRIE &T, char *p)
{
    int x = *p - 'a';
    if(*p == '\0')return T->terminal;
    if(T->fiu[x] == 0)return 0;
    return nrapr(T->fiu[x], p + 1);
}
int prefmax(TRIE &T, char *p)
{
    int x = *p - 'a';
    if(*p == '\0')return 0;
    if(T->fiu[x] == 0)return 0;
    return 1 + prefmax(T->fiu[x], p + 1);
}
int main()
{
    while(fin >> v)
    {
        fin >> cuv;
        if(v == 0)adauga(T, cuv);
        else if(v == 1)sterge(T, cuv);
        else if(v == 2)fout << nrapr(T, cuv) << '\n';
        else fout << prefmax(T, cuv) << '\n';
    }
    return 0;
}