Cod sursa(job #1965902)

Utilizator ana-maria.simiAna-Maria Simionescu ana-maria.simi Data 14 aprilie 2017 18:33:08
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <cstring>
#include <cstdio>
#include <fstream>
#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 Insert(Trie *nod, char *s)
{
    if(*s=='\n')
        nod->cnt++;
        else
            {if(nod->fiu[CH]==0)
        {
            nod->nrfii++;
            nod->fiu[CH]=new Trie;
        }
        Insert(nod->fiu[CH],s+1);}
}

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

int Que(Trie *nod, char *s)
{
    if(*s=='\n')
        return nod->cnt;
        else
        if(nod->fiu[CH])
            return Que(nod->fiu[CH],s+1);
            else
                return 0;
}

int Pre(Trie *nod, char *s, int x)
{
    if(nod->fiu[CH]==0 || *s=='\n')
        return x;
        else
            return Pre(nod->fiu[CH],s+1,x+1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    fgets(line, 25, stdin);
    while(!feof(stdin))
    {
        switch(line[0]) {
            case '0': Insert(T,line+2); break;
            case '1': Delete(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, 25, stdin);
    }

    return 0;
}