Cod sursa(job #804662)

Utilizator socheoSorodoc Ionut socheo Data 30 octombrie 2012 01:09:46
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie{
    int cnt;
    int nrfii;
    Trie *fiu[26];
    Trie(){
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
} *T = new Trie;



void add(Trie *nod, char *w)
{
    printf("%s", w);
    if(*w == '\n')
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[*w - 'a'] == 0)
    {
        nod->fiu[*w - 'a'] = new Trie;
        nod->nrfii++;
    }
    add(nod->fiu[*w - 'a'], w + 1);
}
int sterge(Trie *nod, char *w)
{
    if(*w == '\n')
    {
        nod->cnt--;
    }
    else
        if(sterge( nod->fiu[*w - 'a'], w + 1) == 1)
        {
            nod->fiu[*w - 'a'] = 0;
            nod->nrfii--;
        }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int count(Trie *nod, char *w)
{

    if(*w == '\n')
        return nod->cnt;
    else
        if(nod->fiu[*w - 'a'])
            return count(nod->fiu[*w - 'a'], w + 1);
        else return 0;
}
int prefix(Trie *nod, char *w, int k)
{
    if(*w == '\n' ||  nod->fiu[*w - 'a'] == 0)
        return k;
    return prefix(nod->fiu[*w - 'a'], w + 1, k + 1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int nr;
    char s[32];
    while(!feof(stdin))
    {
        scanf("%d %s", &nr, s);
        if(nr == 0)
            add(T, s);
        if(nr == 1)
            sterge(T, s);
        if(nr == 2)
            printf("%d\n", count(T, s));
        if(nr == 3)
            printf("%d\n", prefix(T, s, 0));
    }

    return 0;
}