Cod sursa(job #1554951)

Utilizator antanaAntonia Boca antana Data 21 decembrie 2015 23:47:20
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <cstdio>
#include<string.h>
using namespace std;
char s[21];
struct nod{
    int ap, nrf;
    nod *fii[26];

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