Cod sursa(job #2305246)

Utilizator refugiatBoni Daniel Stefan refugiat Data 19 decembrie 2018 18:25:50
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
const int sigma=26;
struct Trie {
    Trie *fii[sigma];
    int frecventa,nrf;
    Trie(){
        memset(fii,0,sizeof(fii));
        frecventa=0;
        nrf=0;
    }
};
int caz;
Trie *root=new Trie();
string w;
void inserare(Trie *nod,int pos)
{
    if(pos!=w.size())
    {
        if(!(nod->fii[w[pos]-'a']))
        {
            nod->fii[w[pos]-'a']=new Trie();
            nod->nrf++;
        }
        inserare(nod->fii[w[pos]-'a'],pos+1);
    }
    else nod->frecventa++;
}
bool stergere(Trie *nod,int pos)
{
    if(pos!=w.size())
    {
        if(stergere(nod->fii[w[pos]-'a'],pos+1))
        {
            nod->nrf--;
            nod->fii[w[pos]-'a']=0;
        }
        if((nod->nrf)==0 && (nod->frecventa)==0 && nod!=root)
        {
            delete nod;
            return 1;
        }
        else return 0;
    }
    else
    {
        nod->frecventa--;
        if((nod->nrf)==0 && (nod->frecventa)==0)
        {
            delete nod;
            return 1;
        }
        else return 0;
    }
}
int comun(Trie *nod,int pos)
{
    if(pos!=w.size() && nod->fii[w[pos]-'a'])
        return comun(nod->fii[w[pos]-'a'],pos+1);
    else return pos;
}
int nrap(Trie *nod,int pos)
{
    if(pos==w.size())
        return nod->frecventa;
    else if(nod->fii[w[pos]-'a'])
        return nrap(nod->fii[w[pos]-'a'],pos+1);
    else return 0;
}
int main()
{
    while(fi>>caz)
    {
        fi>>w;
        if(caz==0)
            inserare(root,0);
        if(caz==1)
            stergere(root,0);
        if(caz==2)
            fo<<nrap(root,0)<<"\n";
        if(caz==3)
            fo<<comun(root,0)<<"\n";
    }
    fi.close();
    fo.close();
    return 0;
}