Cod sursa(job #875755)

Utilizator ericptsStavarache Petru Eric ericpts Data 10 februarie 2013 19:01:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
#include <cstring>

#define C (*s-'a')

using namespace std;

char line[35];

int x;

struct trie
{
    int pass;
    int sons;
    trie * fiu[26];
    trie()
    {
        pass = sons = 0;
        memset(fiu,0,sizeof(fiu));
    }
};

trie * T = new trie;

void add(trie * nod,char *s)
{
    while(*s != '\n')
    {
        if(nod->fiu[C]==0)
        {
            nod->fiu[C] = new trie;
            nod->sons++;
        }
        nod = nod->fiu[C];
        ++s;
    }
    nod->pass++;

}

bool del(trie * nod,char *s)
{
    if(*s == '\n')
        nod->pass--;
    else if(del(nod->fiu[C],s+1))
    {
        nod->fiu[C]=0;
        nod->sons--;
    }
    if(nod->sons == 0 && nod->pass == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int ap(trie * nod,char *s)
{
    while(*s != '\n')
    {
        if(nod->fiu[C] == 0)
            return 0;
        nod = nod->fiu[C];
        ++s;
    }
    return nod->pass;
}

void pre(trie * nod,char *s)
{
    while(nod->fiu[C] != 0 && *s != '\n')
    {
        nod = nod->fiu[C];
        ++x;
        ++s;
    }
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    fgets(line,32,stdin);

    while(!feof(stdin))
    {

        switch(line[0])
        {
            case '0' : add(T,line+2);break;
            case '1' : del(T,line+2);break;
            case '2' : printf("%d\n",ap(T,line+2));break;
            case '3' : x=0;pre(T,line+2);printf("%d\n",x);break;
        }
        fgets(line,32,stdin);

    }

    return 0;
}