Cod sursa(job #2288524)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 23 noiembrie 2018 16:21:22
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.44 kb
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
class trie {
public:
    trie *edge[26];
    int fr;
    int sons;
    trie() {
        sons = 0;
        fr = 0;
        for(int i = 0; i < 26; i++)
            edge[i] = NULL;
    }
    static void add_word(char* s, trie* nod, int poz, int l) {
        if(poz == l) {
            nod -> fr++;
            return;
        }
        else {
            if(nod -> edge[s[poz] - 'a'] == NULL) {
                nod -> edge[s[poz] - 'a'] = new trie;
                nod -> sons++;
            }
            add_word(s, nod -> edge[s[poz] - 'a'], poz + 1, l);
        }
    }
    static bool erase_word(char* s, trie* nod, int poz, int l) {
        if(poz == l) {
            nod -> fr--;
            if(nod -> fr == 0 && nod -> sons == 0) {
                delete nod;
                return true;
            }
            return false;
        }
        else {
            if(erase_word(s, nod -> edge[s[poz] - 'a'], poz + 1, l))
            {
                nod -> sons--;
                nod -> edge[s[poz] - 'a'] = NULL;
            }
            if(nod -> fr == 0 && nod -> sons == 0 && poz != 0) {
                delete nod;
                return true;
            }
            return false;
        }
    }
    static int find_fr(char* s, trie* nod, int poz, int l) {
        if(poz == l)
            return nod -> fr;
        if(nod -> edge[s[poz] - 'a'] == NULL)
            return 0;
        return find_fr(s, nod -> edge[s[poz] - 'a'], poz + 1, l);
    }
    static int find_prefix(char* s, trie* nod, int poz, int l) {
        if(poz == l)
            return poz;
        if(nod -> edge[s[poz] - 'a'] == NULL)
            return poz;
        return find_prefix(s, nod -> edge[s[poz] - 'a'], poz + 1, l);
    }
};

trie *Trie = new trie;
char arr[100005];

int main() {
    int tip;
    string s;
    while(in >> tip >> s) {
        int i = -1;
        for (auto ch : s)
            arr[++i] = ch;
        i++;
        if(tip == 0)
            Trie -> add_word(arr, Trie, 0, i);
        else if(tip == 1)
            Trie -> erase_word(arr, Trie, 0, i);
        else if(tip == 2)
            out << Trie -> find_fr(arr, Trie, 0, i) << "\n";
        else
            out << Trie -> find_prefix(arr, Trie, 0, i) << "\n";
        i = -1;
        for (auto ch : s)
            arr[++i] = 0;
    }
    return 0;
}