Cod sursa(job #1398513)

Utilizator dan.ghitaDan Ghita dan.ghita Data 24 martie 2015 11:40:41
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 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()){

        node->fr--;
        if(node->nr_sons == 0 && node->fr == 0) {
            return true;
        }
        else {
            return false;
        }
    }
    else {
        if(node->next[s[indx] - 'a'] == 0)
            return 0;
        if(del(s, node->next[s[indx] - 'a'], indx + 1)){
            node->nr_sons--;
            delete node->next[s[indx] - 'a'];
            node->next[s[indx] - 'a'] = NULL;
            if(node->nr_sons == 0 && node->fr == 0)
                return true;
            else
                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;
}