Cod sursa(job #1347444)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 18 februarie 2015 22:59:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>

using namespace std;

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

int w;
char S[25];

struct trie{
    int nr;
    int nr_fii;
    trie *f[26];

    trie(){
        nr = nr_fii = 0;
        for(int i = 0; i < 26; i ++)
            f[i] = 0;
    }

} *r = new trie ();

void trie_insert(trie *nod, char *S){
    if(*S == 0)
    {
        nod -> nr ++;
        return ;
    }
    if(nod -> f[*S - 'a'] == 0){
        nod -> f[*S - 'a'] = new trie;
        nod -> nr_fii ++;
    }
    trie_insert(nod -> f[*S - 'a'], S + 1);
}
int trie_print_nr(trie *nod, char *S){
    if(*S == 0){
       return nod -> nr;
    }
    if(nod -> f[*S - 'a'] == 0){
        return 0;
    }
    return trie_print_nr(nod -> f[*S - 'a'], S + 1);
}
int trie_print_prefix(trie *nod, char *S){
    if(*S == 0)
        return 0;
    if(nod -> f[*S - 'a'] == 0)
        return 0;
    return 1 + trie_print_prefix(nod -> f[*S - 'a'], S + 1);
}
int trie_delete(trie *&nod, char *S){
    if(*S == 0){
        nod -> nr --;
    if(nod -> nr_fii == 0 && nod -> nr == 0 && r != nod){
        delete nod;
        nod = 0;
        return 1;
    }
    return 0;
    }
    if(trie_delete(nod ->f[*S - 'a'], S + 1) == 1){
        nod -> nr_fii --;
        if(nod -> nr_fii == 0 && nod -> nr == 0 && r != nod){
            delete nod;
            nod = 0;
            return 1;
        }
    }
    return 0;
}
int main()
{
    while(fin >> w >> S)
        if(w == 0)
        {
            trie_insert(r, S);
        }
        else
            if(w == 1)
            {
                trie_delete(r, S);
            }
            else
                if(w == 2)
                {
                    fout << trie_print_nr(r, S) << '\n';
                }
                else
                    {
                        fout << trie_print_prefix(r, S) << '\n';
                    }
    return 0;
}