Cod sursa(job #1221031)

Utilizator acomAndrei Comaneci acom Data 19 august 2014 11:52:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    int nr,fii;
    trie *f[26];
    trie()
    {
        nr=fii=0;
        for (int i=0;i<26;++i)
            f[i]=0;
    }
} *root;
int a;
char s[26];

void adauga(trie *rad, char *s)
{
    if (*s==0)
    {
        rad->nr++;
        return ;
    }
    if (rad->f[*s-'a']==NULL)
    {
        rad->f[*s-'a'] = new trie;
        rad->fii++;
    }
    adauga(rad->f[*s-'a'],s+1);
}

int sterge(trie *&rad, char *s)
{
    if (*s==0)
    {
        rad->nr--;
        if (rad->fii==0 && rad->nr==0 && rad!=root)
        {
            delete rad;
            rad = NULL;
            return 1;
        }
        return 0;
    }
    if (sterge(rad->f[*s-'a'],s+1))
    {
        rad->fii--;
        if (rad->fii==0 && rad->nr==0 && rad!=root)
        {
            delete rad;
            rad = NULL;
            return 1;
        }
    }
    return 0;
}

int aparitii(trie *rad, char *s)
{
    if (*s==0)
        return rad->nr;
    if (rad->f[*s-'a']==NULL)
        return 0;
    return aparitii(rad->f[*s-'a'],s+1);
}

int prefix(trie *rad, char *s)
{
    if (*s==0)
        return 0;
    if (rad->f[*s-'a']==NULL)
        return 0;
    return 1+prefix(rad->f[*s-'a'],s+1);
}

int main()
{
    root = new trie;
    while (fin>>a>>s)
    {
        switch (a)
        {
            case 0:
                adauga(root,s);
            break;
            case 1:
                sterge(root,s);
            break;
            case 2:
                fout<<aparitii(root,s)<<"\n";
            break;
            case 3:
                fout<<prefix(root,s)<<"\n";
            break;
        }
    }
    return 0;
}