Cod sursa(job #2053540)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 31 octombrie 2017 20:46:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TRIE
{
    TRIE *fiu[26];
    int terminal, nrf;
    TRIE()
    {
        nrf = 0; terminal = 0;
        for(int i = 0;  i <= 25; ++i)
            fiu[i] = 0;
    }
};
TRIE *T = new TRIE;
int v, maxim;
char cuv[25];
void adauga(TRIE *nod, char *p)
{
    int x = *p - 'a';
    if(*p == '\0')
    {
        nod->terminal ++;
        return ;
    }
    else if(nod->fiu[x] == 0)
    {
        nod->nrf++;
        nod->fiu[x] = new TRIE;
    }
    adauga(nod->fiu[x], p + 1);
}
bool sterge(TRIE *nod, char *p)
{
     int x = *p - 'a';
     if(*p == '\0')nod->terminal--;
     else if(sterge(nod->fiu[x], p + 1))
     {
         nod->fiu[x] = 0;
         nod->nrf --;
     }
     if(nod->terminal == 0 && nod->nrf == 0 && nod != T)
     {
         delete(nod);
         return 1;
     }
     return 0;
}
int verif(TRIE *nod, char *p)
{
    int x = *p - 'a';
    if(*p =='\0')return nod->terminal;
    else if(nod -> fiu[x])return verif(nod->fiu[x], p + 1);
    return 0;
}
int prefmax(TRIE *nod, char *p)
{
    int x= *p - 'a';
    if(*p == '\0')return 0;
    if(!nod -> fiu[x])return 0;
    return 1 + prefmax(nod ->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 << verif(T, cuv) << '\n';
        else fout << prefmax(T, cuv) << '\n';
    }
    return 0;
}