Cod sursa(job #593843)

Utilizator peanutzAndrei Homorodean peanutz Data 4 iunie 2011 18:24:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <string.h>

int t;
char s[34];

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;
       T->nrFii++;
     }
    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, int k)
{

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

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
   
    while(!feof(stdin))
    {
        memset(s, 0, sizeof(s));
        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, 0));
        }
    }
   

return 0;
}