Cod sursa(job #1873962)

Utilizator ArambasaVlad Arambasa Arambasa Data 9 februarie 2017 15:55:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <string.h>

using namespace std;

ifstream in ("trie.in");
ofstream out ("trie.out");

struct Trie
{
    int n,nsons;
    Trie *son[26];
    Trie()
    {
        n=nsons=0;
        for(int i=0;i<26;i++)
        {
            son[i]=0;
        }
    }
};
Trie *T=new Trie;
char s[25];
void ADD (Trie *nod,char *sir)
{
    int Letter=*sir-'a';
    if(*sir==NULL)
    {
        nod->n++;
        return;
    }
    if(nod->son[Letter]==0)
    {
        nod->son[Letter]=new Trie;
        nod->nsons++;
    }
    ADD(nod->son[Letter],sir+1);
}
int DELETE (Trie *nod,char *sir)
{
    int Letter=*sir-'a';
    if (*sir==NULL)
    {
        nod->n--;
    }
    else
    {
        if (DELETE(nod->son[Letter],sir+1)==1)
        {
            nod->son[Letter]=0;
            nod->nsons--;
        }
    }
    if (nod->n==0&&nod->nsons==0&&nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int NRAPP(Trie *nod,char *sir)
{
    int Letter = *sir-'a';
    if (*sir==NULL)
        return nod->n;
    if (nod->son[Letter]==0)
        return 0;
    return NRAPP(nod->son[Letter],sir+1);
}
int NRPREF(Trie *nod, char *sir, int cont)
{
    int Letter=*sir-'a';
    if(*sir ==NULL)
        return cont;
    if(nod->son[Letter]==0)
        return cont;
    return NRPREF(nod->son[Letter],sir+1,cont+1);
}
int main()
{
    while(in.getline(s,25))
    {
        int opt=*s-'0';
        switch(opt)
        {
            case 0: ADD(T,s+2);break;
            case 1: DELETE(T,s+2);break;
            case 2: out<<NRAPP(T,s+2)<<'\n';break;
            case 3: out<<NRPREF(T,s+2,0)<<'\n';break;
        }
    }
}