Cod sursa(job #2433995)

Utilizator AlexBolfaAlex Bolfa AlexBolfa Data 30 iunie 2019 11:45:33
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
#define LMAX 25
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
    int nr;
    short nrchild;
    trie *child[27];

    trie(){
        nr=nrchild=0;
        memset(child,0,sizeof(child));
    }
};

trie* T = new trie;
int lg;
char s[LMAX];
char *it;

void Add(trie*);
void Del(trie*);
int Cnt(trie*);
void Lg(trie*);

int main(){
    short task;
    while(fin>>task>>s){
        it=s;
        switch(task){
            case 0:
                Add(T);
                break;
            case 1:
                Del(T);
                break;
            case 2:
                fout<<Cnt(T)<<'\n';
                break;
            case 3:
                lg=0;
                Lg(T);
                fout<<lg<<'\n';
                break;
        }
    }
    return 0;
}
void Lg(trie* t){
    char ch=*it-'a';

    if(*it==0 || t->child[ch] == false)
        return;

    ++lg;

    ++it;
    Lg(t->child[ch]);
}
int Cnt(trie* t){
    char ch=*it-'a';

    if(*it==0)
        return t->nr;
    if(t->child[ch] == false)
        return 0;

    ++it;
    return Cnt(t->child[ch]);
}
void Del(trie* t){
    if(*it==0){
        --t->nr;
        return;
    }
    char ch=*it-'a';

    ++it;
    Del(t->child[ch]);

    if(t->child[ch]->nrchild == 0 && t->child[ch]->nr == 0){
        --(t->nrchild);
        delete t->child[ch];
        t->child[ch]=0; ///Why?
    }
}
void Add(trie* t){
    if(*it == 0){
        ++t->nr;
        return;
    }

    char ch=*it-'a';

    if(t->child[ch] == false){
        t->child[ch]= new trie();
        ++t->nrchild;
    }

    ++it;
    Add(t->child[ch]);

}