Cod sursa(job #1024023)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 8 noiembrie 2013 00:38:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define ch (*s - 'a')
#define operation (*word - '0')

using namespace std;

struct Trie
{
    int nrfii, nrcuv;
    Trie *fiu[26];
    Trie()
    {
        nrfii = nrcuv = 0;
        for (int i = 0; i<26; ++i)
            fiu[i] = NULL;
    }
};
Trie *T = new Trie;

inline void Add(Trie *nod, const char *s)
{
    if (*s == 0)
    {
        nod->nrcuv++;
        return;
    }
    if (nod->fiu[ch] == 0)
    {
        nod->fiu[ch] = new Trie;
        nod->nrfii++;
    }
    Add(nod->fiu[ch], s+1);
}


inline bool Delete(Trie *nod, const char *s)
{
    if (*s == 0)
    {
        nod->nrcuv--;
    }
    else
        if (Delete(nod->fiu[ch], s+1))
        {
            nod->nrfii--;
            nod->fiu[ch] = 0;
        }
    if (nod->nrfii == 0 && nod->nrcuv == 0 && nod!=T)
    {
        delete nod;
        return true;
    }
    return false;

//    if (*s == 0)
//    {
//        nod->nrcuv--;
//        if (nod->nrcuv == 0 && nod->nrfii == 0 && nod != T)
//        {
//            delete nod;
//            return true;
//        }
//        return false;
//    }
//    if (Delete(nod->fiu[ch], s+1))
//    {
//        nod->nrfii--;
//        if (nod->nrfii == 0 && nod->nrcuv == 0 && nod!=T)
//        {
//            delete nod;
//            return true;
//        }
//    }
//    return false;
}

inline int Aparitii(const Trie *nod, const char *s)
{
    if (*s == 0)
        return nod->nrcuv;
    if (nod->fiu[ch])
        return Aparitii(nod->fiu[ch], s+1);
    return 0;
}

inline int Prefix(const Trie *nod, const char *s)
{
    if (*s == 0 || nod->fiu[ch] == 0)
        return 0;
    return 1 + Prefix(nod->fiu[ch], s+1);
}

int main()
{
    char word[30];
    ifstream f ("trie.in");
    ofstream g ("trie.out");
    while (f.getline(word, 30))
    {
        switch (operation)
        {
            case 0:
                Add(T, word+2);
                break;
            case 1:
                Delete(T, word+2);
                break;
            case 2:
                g<<Aparitii(T, word+2)<<"\n";
                break;
            case 3:
                g<<Prefix(T, word+2)<<"\n";
                break;
        }
    }
    f.close();
    g.close();
    return 0;
}