Cod sursa(job #1336029)

Utilizator nicol.bolasNicol Bolas nicol.bolas Data 6 februarie 2015 13:46:16
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 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 t;
char a[28];
void actualizare(trie *r, char *s)
{
    if (*s==0)
    {
        r->nr++;
        return ;
    }
    if (r->f[*s-'a']==NULL)
        r->f[*s-'a']=new trie, r->fii++;
    actualizare(r->f[*s-'a'],s+1);
}
bool sterge(trie *&r, char *s)
{
    if (*s==0)
    {
        r->nr--;
        if (r->nr==0 && r->fii==0 && r!=root)
        {
            delete r;
            r=NULL;
            return true;
        }
        else
            return false;
    }
    bool ok=sterge(r->f[*s-'a'],s+1);
    if (ok) r->fii--;
    if (r->nr==0 && r->fii==0 && r!=root)
    {
        delete r;
        r=NULL;
        return true;
    }
    else
        return false;
}
int aparitii(trie *r, char *s)
{
    if (*s==0)
        return r->nr;
    if (r->f[*s-'a']==NULL)
        return 0;
    return aparitii(r->f[*s-'a'],s+1);
}
int prefix(trie *r, char *s)
{
    if (*s==0 || r->f[*s-'a']==NULL)
        return 0;
    return 1+prefix(r->f[*s-'a'],s+1);
}
int main()
{
    root=new trie;
    while (fin>>t>>a)
    {
        switch (t)
        {
            case 0:
                actualizare(root,a);
            break;
            case 1:
                sterge(root,a);
            break;
            case 2:
                fout<<aparitii(root,a)<<"\n";
            break;
            case 3:
                fout<<prefix(root,a)<<"\n";
            break;
        }
    }
    return 0;
}