Cod sursa(job #2300192)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 10 decembrie 2018 22:28:48
Problema Trie Scor 0
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, sons;
    Trie *fii[26];
    Trie(){

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


};

Trie *T = new Trie();

string s;

void Add(Trie *nod,int k)
{
    if(k == s.size())
    {
        nod->nr++;
        return;
    }

    if(nod->fii[(s[k]-'a')] == NULL)
     nod->fii[(s[k]-'a')] = new Trie();


    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;
    }
    if(nod->fii[(s[k]-'a')])
      return   Query(nod->fii[(s[k]-'a')], k+1);




}

int Prefix(Trie *nod, int k)
{
    if(k == s.size() || nod->fii[(s[k]-'a')] == 0)
        return k;
        if(nod->fii[(s[k]-'a')] &&(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;

    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;
}