Cod sursa(job #1554995)

Utilizator antanaAntonia Boca antana Data 22 decembrie 2015 01:04:22
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <cstdio>
#include<string.h>
using namespace std;
char sir[30];
struct nod{
    int ap, nrf;
    nod *fii[26];

    nod(){
        ap=nrf=0;
        memset(fii, 0, sizeof(fii));
    }
};
nod *radacina;
void adauga(nod *aux, char *s)
{
    if(*s==0)
    {
        aux->ap++;
        return;
    }
    if(aux->fii[*s-'a']==0)
    {
        aux->fii[*s-'a']=new nod;
        aux->nrf++;
    }
    adauga(aux->fii[*s-'a'], s+1);
}
int sterge(nod *aux, char *s)
{
    if(*s==0)
        aux->ap--;
    else
    {
        if(sterge(aux->fii[*s-'a'], s+1))
        {
            aux->fii[*s-'a']=0;
            aux->nrf--;
        }
    }
    if(aux->nrf==0&&aux->ap==0&&aux!=radacina)
    {
        delete aux;
        return 1;
    }
    return 0;
}
int parcurgere(nod *aux, char *s)
{
    if(*s==0)
        return aux->ap;
    if(aux->fii[*s-'a'])
        return parcurgere(aux->fii[*s-'a'], s+1);
    return 0;
}
int prefix(nod *aux, char *s, int pr)
{
    if(*s==0 || aux->fii[*s-'a']==0)
        return pr;
    return prefix(aux->fii[*s-'a'], s+1, pr+1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int q, n;
    gets(sir);
    radacina=new nod;
    while(!feof(stdin))
    {
        q=sir[0]-'0';
        strcpy(sir, sir+2);
        if(q==0)
            adauga(radacina, sir);
        if(q==1)
            sterge(radacina, sir);
        if(q==2)
            printf("%d\n", parcurgere(radacina, sir));
        if(q==3)
            printf("%d\n", prefix(radacina, sir, 0));
        gets(sir);
    }
    return 0;
}