Cod sursa(job #1398413)

Utilizator dan.ghitaDan Ghita dan.ghita Data 24 martie 2015 10:44:23
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

class Trie {
public:
    char value;
    int fr, nr_sons;
    Trie* next[26];
    Trie();
    static void add(const string&, Trie *, int);
    static bool del(const string&, Trie *, int);
    static int freq(const string&, Trie*, int);
    static int prefix(const string&, Trie*, int);

};

Trie::Trie(){
        value = '~';
        fr = nr_sons = 0;
        for(int i = 0; i < 26; ++i)
            next[i] = NULL;
}


void Trie::add(const string &s, Trie *node, int indx = 0){

    if(indx == s.size()) {
        node->fr++;
        return;
    }
    else {
        if(node->next[s[indx] - 'a'] == NULL){
            node->next[s[indx] - 'a'] = new Trie();
            node->nr_sons++;
        }
        node->next[s[indx] - 'a'] -> value = s[indx];
        add(s, node->next[s[indx] - 'a'], indx + 1);

    }
}

bool Trie::del(const string &s, Trie *node, int indx = 0){

    if (indx == s.size())
        if(node->fr > 1) {
            node->fr--;
            return false;
        }
        else {
            return true;
        }
    else {
        if(del(s, node->next[s[indx] - 'a'], indx + 1))
            if(node->nr_sons == 0){
                delete node->next[s[indx] - 'a'];
                node->next[s[indx] - 'a'] = NULL;
                return true;
            }
            else {
                node->nr_sons--;
                delete node->next[s[indx] - 'a'];
                node->next[s[indx] - 'a'] = NULL;
                return false;
            }
        else
            return false;
    }

}


int Trie::freq(const string &s, Trie *node, int indx = 0){

    if(indx == s.size())
        return node->fr;
    else {
        if(node->next[s[indx] - 'a'] == NULL)
            return 0;
        else
            return freq(s, node->next[s[indx] - 'a'], indx + 1);
    }

}

int Trie::prefix(const string &s, Trie *node, int indx = 0){

    if(indx == s.size())
        return 0;
    else {
        if(node->next[s[indx] - 'a'] == NULL)
            return 0;
        else
            return 1 + prefix(s, node->next[s[indx] - 'a'], indx + 1);
    }

}


int main()
{
    string s;
    int type;
    Trie* root = new Trie();
    while(f>>type) {
        f>>s;
        switch (type){
            case 0:

                Trie::add(s, root);
                break;
            case 1:
                Trie::del(s, root);
                break;
            case 2:
                g<<Trie::freq(s, root)<<'\n';
                break;
            case 3:
                g<<Trie::prefix(s, root)<<'\n';
                break;
        }
    }





    return 0;
}