Cod sursa(job #1649063)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 11 martie 2016 12:26:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;
ifstream f("trie.in");
ofstream g("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)
    {
        cout<<"DA";
        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(f.getline(s,25))
    {
        int opt = *s - '0';
        if(opt == 0) ADD(T,s+2);
        if(opt == 1) DELETE(T,s+2);
        if(opt == 2) g<<NRAPP(T,s+2)<<'\n';
        if(opt == 3) g<<NRPREF(T,s+2,0)<<'\n';
    }
    return 0;
}