Cod sursa(job #2300183)

Utilizator TudorCaloianCaloian Tudor-Ioan TudorCaloian Data 10 decembrie 2018 22:20:59
Problema Trie Scor 55
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 = 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())
    {
        if(nod->nr)
            nod->nr--;

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

    }
    if(nod->nr == 0 && nod->sons == 0 && nod!=T)
     {
         delete nod; return 1;
     }

    return 0;
}

int Query(Trie *nod, int k)
{
    if(k == s.size())
    {

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


    return 0;


}

int Prefix(Trie *nod, int k)
{
    if(s[k] == NULL || nod->fii[(s[k]-'a')] == 0)
        return k;
    return Prefix(nod->fii[(s[k]-'a')], k+1);
}

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