Cod sursa(job #2232363)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 18 august 2018 20:15:22
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')
using namespace std;
char line[32];
struct trie{
    int cnt,nrfii;
    trie *fiu[26];
    trie(){
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};
trie *t=new trie;
void ins(trie *nod, char *s)
{
    if(*s=='\n')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[CH]==0)
    {
        nod->fiu[CH]=new trie;
        nod->nrfii++;
    }
    ins(nod->fiu[CH],s+1);
}
int del(trie* nod, char *s)
{
    if(*s=='\n')
    {
        nod->cnt--;
    }
    else if(del(nod->fiu[CH],s+1))
    {
        nod->nrfii--;
        nod->fiu[CH]=0;
    }
    if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int que(trie *nod, char *s)
{
    if(*s=='\n')
    {
        return nod->cnt;
    }
    if(nod->fiu[CH])
    {
        return que(nod->fiu[CH],s+1);
    }
    return 0;
}
int pre(trie *nod, char *s, int k)
{
    if(*s=='\n' || nod->fiu[CH]==0)
        return k;
    return pre(nod->fiu[CH],s+1,k+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    fgets(line,32,stdin);

    while(!feof(stdin))
    {
        switch(line[0])
        {
            case '0': ins(t,line+2); break;
            case '1': del(t,line+2); break;
            case '2': printf("%d\n",que(t,line+2)); break;
            case '3': printf("%d\n",pre(t,line+2,0)); break;
        }
        fgets(line,32,stdin);
    }
    return 0;
}