Cod sursa(job #1168489)

Utilizator rockerboyHutter Vince rockerboy Data 8 aprilie 2014 19:17:27
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <iostream>
#include <string>
#include <cstring>


using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
typedef string::iterator sIterator;

class Trie
{
    private:
        int aktdb, vege;
        Trie* kov[26];
    public:
        Trie()
        {
            vege = 0;
            aktdb = 0;
            memset (kov, 0, 104);
        }
        ~Trie()
        {
            for (int i=0; i<26; i++)
                if (kov[i])
                {
                    delete kov[i];
                    kov[i] = NULL;
                }
        }
        void betesz (sIterator kezd, sIterator veg)
        {
            if (kezd == veg) {vege++; return;}
            if (!kov[*kezd-'a']) kov[*kezd-'a'] = new Trie;
            kov[*kezd-'a']->aktdb++;
            kov[*kezd-'a']->betesz (kezd+1, veg);
        }
        void kivesz (sIterator kezd, sIterator veg)
        {
            if (kezd == veg) {vege--; return;}
            if (kov[*kezd-'a']->aktdb == 1) {
                delete kov[*kezd-'a'];
                kov[*kezd-'a'] = NULL;
                return;
            }
            else {
                kov[*kezd-'a']->aktdb--;
                kov[*kezd-'a']->kivesz (kezd+1, veg);
            }
        }
        int szamol (sIterator kezd, sIterator veg)
        {
            if (kezd == veg) return vege;
            if (kov[*kezd-'a']) return kov[*kezd-'a']->szamol (kezd+1, veg);
            else return 0;
        }
        int prefix (sIterator kezd, sIterator veg)
        {
            if (kov[*kezd-'a']) return 1 + kov[*kezd-'a']->prefix(kezd+1, veg);
            return 0;
        }
};

Trie* gyoker = new Trie;
int p;
string akt;
void betesz(string&), kivesz(string&), torol(string&), szamol(string&), prefix(string&);


int main()
{
    while (f >> p >> akt)
    {
        if (p == 0) gyoker->betesz(akt.begin(), akt.end());
        else if (p == 1) gyoker->kivesz(akt.begin(), akt.end());
        else if (p == 2) g << gyoker->szamol(akt.begin(), akt.end()) << "\n";
        else if (p == 3) g << gyoker->prefix(akt.begin(), akt.end()) << "\n";
    }
}