Cod sursa(job #2398213)

Utilizator CezarTDTodirisca Cezar CezarTD Data 5 aprilie 2019 10:37:12
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstring>
#include <iostream>
#define ch (*s-'a')

using namespace std;
struct Trie
{
    int nrfii;
    int cnt;
    Trie *fii[26];
    Trie()
    {
        cnt=0;
        nrfii=0;
        memset(fii,0,sizeof(fii));
    }
};

Trie *T = new Trie;
void ins(Trie *nod,char *s)
{
    if(*s=='\n')
    {
        nod->cnt++;
        return ;
    }
    if(nod->fii[ch]==0)
    {
        nod->fii[ch]= new Trie;
        nod->nrfii++;
    }
    ins(nod->fii[ch],s+1);
}

int del(Trie *nod,char *s)
{
    if(*s=='\n')
        nod->cnt--;
    else
    {
        if(del(nod->fii[ch],s+1))
        {
            nod->fii[ch]=0;
            nod->nrfii--;
            nod->cnt--;
        }
    }
    if(nod->cnt==0 && nod->nrfii==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int apar(Trie *nod,char *s)
{
    if(*s=='\n')
        return nod->cnt;
    if(nod->fii[ch])
        return apar(nod->fii[ch],s+1);
    return 0;
}

int pre(Trie *nod,char *s,int k)
{
    if(*s=='\n' || nod->fii[ch]==0)
        return k;
    return pre(nod->fii[ch],s+1,k+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    char linie[25];
    fgets(linie,25,stdin);
    while(!feof(stdin))
    {
        strcat(linie,"\n");
        switch(linie[0])
        {
        case '0':
            ins(T,linie+2);
            break;
        case '1':
            del(T,linie+2);
            break;
        case '2':printf("%d\n",apar(T,linie+2));break;
        case '3':
            printf("%d\n",pre(T,linie+2,0));
            break;
        }
        fgets(linie,25,stdin);
    }
    return 0;
}

/*maturity
impact
consequences

Always take responsibility for your actions
Taking responsability is a proof of maturity

Is it ok to take responsibility for someone's actions?
*/