Cod sursa(job #1211880)

Utilizator acomAndrei Comaneci acom Data 23 iulie 2014 14:16:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    int fii,nr;
    trie *f[26];
    trie()
    {
        fii=nr=0;
        for (int i=0;i<26;++i)
            f[i]=0;
    }
} *root;
int t;
char s[26];
void insertTrie(trie *r, char *s)
{
    if (*s!=0)
    {
        if (r->f[*s-'a']==0)
            r->f[*s-'a'] = new trie, r->fii++;
        insertTrie(r->f[*s-'a'],s+1);
    }
    else
        r->nr++;
}
int deleteTrie(trie *&r, char *s)
{
    if (*s==0)
    {
        r->nr--;
        if (r->fii==0 && r->nr==0 && r!=root)
        {
            delete r;
            r = NULL;
            return 1;
        }
    }
    else
    {
        if (deleteTrie(r->f[*s-'a'],s+1)!=0)
        {
            r->fii--;
            if (r->fii==0 && r->nr==0 && r!=root)
            {
                delete r;
                r = NULL;
                return 1;
            }
        }
    }
    return 0;
}
int queryTrie(trie *&r, char *s)
{
    if (*s==0)
        return r->nr;
    if (r->f[*s-'a']==0)
        return 0;
    return queryTrie(r->f[*s-'a'],s+1);
}
int prefixTrie(trie *&r, char *s)
{
    if (*s==0 || r->f[*s-'a']==0)
        return 0;
    return 1+prefixTrie(r->f[*s-'a'],s+1);
}
int main()
{
    root = new trie;
    while (fin>>t>>s)
    {
        switch (t)
        {
            case 0:
                insertTrie(root,s);
            break;
            case 1:
                deleteTrie(root,s);
            break;
            case 2:
                fout<<queryTrie(root,s)<<"\n";
            break;
            case 3:
                fout<<prefixTrie(root,s)<<"\n";
            break;
        }
    }
    return 0;
}