Cod sursa(job #593833)

Utilizator peanutzAndrei Homorodean peanutz Data 4 iunie 2011 17:37:32
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <string.h>

int t;
char s[30];

struct Trie
{
    Trie *fii[26];
    int cnt, nrFii;
    Trie()
    {
        cnt = nrFii = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *Root = new Trie();

void insert(Trie *T, char *s)
{
    if (s[0] == '\0')
    {
        T->cnt++;
        return ;
    }

    if (T->fii[s[0]-'a'] == NULL)
    {
       T->fii[s[0]-'a']  = new Trie();
     }
    insert(T->fii[s[0]-'a'], s+1);
}

int del(Trie *T, char *s)
{
    if (s[0] == '\0')
    {
        T->cnt--;   
    }
    else if (del(T->fii[s[0]-'a'], s+1))
    {
        T->nrFii--;
        T->fii[s[0]-'a'] = NULL;
    }

   

if (T != Root && T->cnt == 0 && T->nrFii == 0)
    {
        delete T;
        return 1;
    }
    return 0;

}

int find(Trie *T, char *s)
{
    if (s[0] == '\0')
    {
        return T->cnt;
    }
    else if (T->fii[s[0]-'a'] == NULL)
    {
       return 0;
    }
    return find(T->fii[s[0]-'a'], s+1);
}

int prefix(Trie *T, char *s)
{
    if (s[0] == '\0')
        return 0;
    else if (T->fii[s[0]-'a'] == NULL)
    {
        return 0;
    }
    return 1+prefix(T->fii[s[0]-'a'], s+1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
   
    while(!feof(stdin))
    {
        scanf("%d %s\n", &t, s);
        if (t == 0)
        {
            insert(Root, s);
        }
        else if (t == 1)
        {
            del(Root, s);
        }
        else if (t == 2)
        {
            printf("%d\n", find(Root, s));
        }
        else
        {
            printf("%d\n", prefix(Root, s));
        }
    }
   

return 0;
}