Cod sursa(job #1289777)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 10 decembrie 2014 11:58:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#define ch (*s-'a')

using namespace std;

struct Trie
{
    Trie *leg[26];
    int nrfii,fr;
    Trie()
    {
        for(int i=0;i<26;++i) leg[i]=0;
        fr=nrfii=0;
    }
};
Trie *rad=new Trie;
char s[30];

inline void Add(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->fr++; return;
    }
    if(nod->leg[ch]==0)
    {
        nod->leg[ch]= new Trie;
        nod->nrfii++;
    }
    Add(nod->leg[ch],s+1);
}

inline int Search(Trie *nod, char *s)
{
    if(*s=='\0') return nod->fr;
    if(nod->leg[ch]==0) return 0;
    return Search(nod->leg[ch],s+1);
}

inline int Lg(Trie *nod, char *s, int len)
{
    if(*s=='\0' || nod->leg[ch]==0) return len;
    return Lg(nod->leg[ch],s+1,len+1);
}

inline int Delete(Trie *nod, char *s)
{
    if(*s=='\0')
        nod->fr--;
    else
        if(Delete(nod->leg[ch],s+1))
        {
            nod->nrfii--;
            nod->leg[ch]=0;
        }
    if(nod->nrfii==0 && nod->fr==0 && nod!=rad)
    {
        delete nod;
        return true;
    }
    return false;
}

int main()
{
    int tip,ok;
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    while(fin>>tip>>s)
    {
        if(!tip) Add(rad,s);
        else
            if(tip==1) ok=Delete(rad,s);
            else
                if(tip==2) fout<<Search(rad,s)<<"\n";
                else
                    fout<<Lg(rad,s,0)<<"\n";
    }
    return 0;
}