Cod sursa(job #1153677)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 25 martie 2014 17:26:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cstring>
#define ch (*s -'a')

using namespace std;

struct Trie
{
    int nrfii,fr;
    Trie *leg[26];
    Trie()
    {
        nrfii=fr=0;
        memset(leg, 0, sizeof(leg));
    }
};
Trie *rad;

inline void Insert(Trie *nod, char *s)
{
    if(*s=='\0')
    {
        nod->fr++;
        return;
    }
    if(nod->leg[ch]==0)
    {
        nod->leg[ch]=new Trie;
        nod->nrfii++;
    }
    Insert(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 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->fr==0 && nod->nrfii==0 && nod!=rad)
    {
        delete nod;
        return 1;
    }
    return 0;
}

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

int main()
{
    int x;
    char sir[30];
    ifstream fin ("trie.in");
    ofstream fout ("trie.out");
    rad= new Trie;
    while(fin>>x>>sir)
    {
        if(!x)
            Insert(rad,sir);
        else
            if(x==1)
                Delete(rad,sir);
            else
                if(x==2)
                    fout<<Search(rad,sir)<<"\n";
                else
                    fout<<Prefix(rad,sir,0)<<"\n";
    }
    fin.close();
    fout.close();
    return 0;
}