Cod sursa(job #244383)

Utilizator mircea_infoSuciu Mircea-Gabriel mircea_info Data 14 ianuarie 2009 22:34:49
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <cstdio>
#include <cstring>

using namespace std;

char s[50];

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

trie *t1=new trie;

void baga(trie *node,char *s)
{
    if(*s=='\n')
    {
        node->numara++;
        return;
    }
    int poz=*s-'a';
    if(node->fiu[poz]==0)
    {
        node->fiu[poz]=new trie;
        node->total ++;
    }
    baga(node->fiu[poz],s+1);
}

int sterge(trie *node,char *s)
{
    if(*s=='\n')
        node->numara--;
    else
        if(sterge(node->fiu[*s-'a'],s+1))
        {
            node->fiu[*s-'a']=0;
            node->total--;
        }
    if(node->numara==0 && node->total==0 && node != t1 )
    {
        delete node;
        return 1;
    }
    return 0;
}

int query(trie *node,char *s)
{
    if(*s=='\n')
        return node->numara;
    if(node->fiu[*s-'a'])
        return query(node->fiu[*s-'a'],s+1);
    return 0;
}

int prefix(trie *node,char *s,int nr)
{
    if(*s=='\n' || node->fiu[*s-'a']==0)
        return nr;
    return prefix(nod->fiu[*s-'a'],s+1,nr+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(s,32,stdin);
    while(!feof(stdin))
    {
        switch(s[0])
        {
            case '0': baga(t1,s+2); break;
            case '1': sterge(t1,s+2); break;
            case '2': printf("%d\n",query(t1,s+2)); break;
            case '3': printf("%d\n",prefix(t1,s+2,0)); break;
        }
        fgets(s,32,stdin);
    }
    return 0;
}