Cod sursa(job #240979)

Utilizator RobybrasovRobert Hangu Robybrasov Data 9 ianuarie 2009 01:08:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <cstdio>
#include <cstring>

typedef struct noduri
{
    int cuv,fii;
    noduri *L[26];
    noduri()
    {
        fii=cuv=0;
        memset(L,0,sizeof(L));
    }
} trie;

char w[21];
trie *T;

void insert(trie *t, char *c)
{
    if (*c=='\n') t->cuv++;
    else
    {
        int ch=*c-'a';
        if (t->L[ch]==NULL)
        {
            t->L[ch]=new trie;
            t->fii++;
        }
        insert(t->L[ch],c+1);
    }
}

int count_words(trie *t, char *c)
{
    if (*c=='\n') return t->cuv;
    else
        if (t->L[*c-'a']) return count_words(t->L[*c-'a'],c+1);
        else return 0;
}

int count_prefix(trie *t, char *c)
{
    if (*c=='\n' || t->L[*c-'a']==NULL || t->fii==0) return 0;
    else
        return count_prefix(t->L[*c-'a'],c+1)+1;
}

int erase(trie *t, char *c)
{
    if (*c=='\n')
    {
        t->cuv--;
        if (t->cuv==0 && t->fii==0 && t!=T)
        {
            delete t;
            return 1;
        }
    }
    else
    {
        if (erase(t->L[*c-'a'],c+1))
        {

            t->fii--;
            t->L[*c-'a']=0;
        }
        if (t->cuv==0 && t->fii==0 && t!=T)
        {
            delete t;
            return 1;
        }
        else return 0;
    }
}

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

    fgets(w,21,stdin);
    while (!feof(stdin))
    {
        switch (w[0])
        {
            case '0':insert(T,w+2); break;
            case '1':erase(T,w+2); break;
            case '2':printf("%d\n",count_words(T,w+2)); break;
            case '3':printf("%d\n",count_prefix(T,w+2)); break;
        }
        fgets(w,21,stdin);
    }

    return 0;
}