Cod sursa(job #1728212)

Utilizator EdyOnuEdy Onu EdyOnu Data 12 iulie 2016 15:10:15
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <cstring>
#include <fstream>
#define Alfa_Size 27
using namespace std;
ofstream g("trie.out");

struct Trie
{
    int nrWord,nrFii;
    Trie *Litere[Alfa_Size];
    Trie()
    {
        nrFii=nrWord=0;
        memset(Litere,NULL,sizeof(Litere));
    }
};

Trie *Rad;

void Add_In_Trie(Trie *nod,char *s)
{
    if(*s==NULL){
        ++nod->nrWord;
        return;
    }
    if(nod->Litere[*s-'a']==NULL){
        ++nod->nrFii;
        nod->Litere[*s-'a']=new Trie;
    }
    Add_In_Trie(nod->Litere[*s-'a'],s+1);
}

inline int GetPref(Trie *nod,char *s,int dim)
{
    if( *s==NULL || nod->Litere[*s-'a']==NULL)return dim;
    return GetPref(nod->Litere[*s-'a'],s+1,dim+1);
}

inline int Nrcuv(Trie *nod,char *s)
{
    if(*s==NULL){
        return nod->nrWord;
    }
    if(nod->Litere[*s-'a']==NULL)return 0;
    return Nrcuv(nod->Litere[*s-'a'],s+1);
}

inline bool DeleteWord(Trie *nod,char *s)
{
    if(*s==NULL)--nod->nrWord;
    else
        if(DeleteWord(nod->Litere[*s-'a'],s+1)){
            nod->Litere[*s-'a']=NULL;
            --nod->nrFii;
        }
    if(!nod->nrFii && !nod->nrWord && nod!=Rad){
        delete nod;
        return 1;
    }
    return 0;
}

inline void ReadData()
{
    Rad=new Trie;
    ifstream f("trie.in");
    char x[21]="";
    while(f.getline(x,21)){
        int val=x[0]-48;
        switch(val)
        {
            case 0:{
                Add_In_Trie(Rad,x+2);
                break;
            }
            case 1:{
                int a=DeleteWord(Rad,x+2);
                break;
            }
            case 2:{
                g<<Nrcuv(Rad,x+2)<<'\n';
                break;
            }
            case 3:{
                g<<GetPref(Rad,x+2,0)<<'\n';
                break;
            }
        }
    }
}


int main()
{
    ReadData();
    return 0;
}