Cod sursa(job #2300198)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 10 decembrie 2018 22:39:48
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

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

    int nr, sons;
    Trie *fii[26];
    Trie(){

        nr = sons = 0;
        memset(fii, 0, sizeof(fii));
    }


};

Trie *T;

string s;

void Add(Trie *&nod,int k)
{

    if(nod == NULL)
     nod = new Trie();
    if(k == s.size())
    {
        nod->nr++;
        return;
    }




    nod->sons++;
    Add(nod->fii[(s[k]-'a')], k+1);

}

bool Delete(Trie *&nod, int  k)
{
    if(k == s.size())
    {

            nod->nr--;

    }
    else
    {
        nod->sons--;
        Delete(nod->fii[(s[k]-'a')], k+1);
    }
    if(nod->nr == 0 && nod->sons == 0)
     {
         delete nod; nod = NULL;
     }


}

int Query(Trie *&nod, int k)
{
    if(nod == NULL)
        return 0;
    if(k == s.size())
    {

        return nod->nr;
    }

      return   Query(nod->fii[(s[k]-'a')], k+1);




}

int Prefix(Trie *&nod, int k)
{
    if(k == s.size())
        return k;
        if(nod->fii[(s[k]-'a')] != NULL && (nod->fii[s[k]-'a']->nr || nod->fii[s[k]-'a']->sons ))
            return Prefix(nod->fii[(s[k]-'a')], k+1);
    return k;
}

int main()
{
    short w;
    T = new Trie();
    while(fin>>w>>s)
    {
        if(w == 0)
            Add(T, 0);
        else
            if(w == 1)
                Delete(T, 0);
            else
                if(w == 2)
                  fout <<  Query(T, 0) << '\n';
                else
                    fout << Prefix(T, 0) << '\n';

    }





    return 0;
}