Cod sursa(job #2490007)

Utilizator KataIsache Catalina Kata Data 9 noiembrie 2019 16:03:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie{
    int nr=0;
    int nrchild=0;
    trie *child[27]={};
};

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

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

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

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

    ++lg;

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

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


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

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

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

    char ch=*it-'a';

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

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

}