Cod sursa(job #2081537)

Utilizator osiaccrCristian Osiac osiaccr Data 4 decembrie 2017 19:58:14
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#define DEF 25

using namespace std;

struct nod {
    int info;
    int fii;
    nod * v[26];

    nod () {
        info = fii = 0;
        for (int i = 0; i < 26; ++ i)
            v[i] = NULL;
    }
};

ifstream fin ("trie.in");
ofstream fout ("trie.out");

nod * root = new nod;

char w[DEF];

int t;

void trie_add (nod * & r, char * s) {
    if (* s == 0) {
        ++ r -> info;
    }
    else {
        if (r -> v[* s - 'a'] == NULL) {
            r -> v[* s - 'a'] = new nod;
            ++ r -> fii;
        }
        trie_add (r -> v[* s - 'a'], s + 1);
    }
}

int trie_check (nod * r, char * s) {
    if (* s == 0) {
        return r -> info;
    }
    else {
        if (r -> v[* s - 'a'] == NULL)
            return 0;
        else
            return trie_check (r -> v[* s - 'a'], s + 1);
    }
}

void trie_delete (nod * & r, char * s) {
    if (* s == 0) {
        -- r -> info;
        if (r -> info == 0 && r -> fii == 0 && r != root) {
            delete r;
            r = NULL;
        }
    }
    else {
        trie_delete (r -> v[* s - 'a'], s + 1);
        if (r -> v[* s - 'a'] == NULL) {
            -- r -> fii;
        }
        if (r -> info == 0 && r -> fii == 0 && r != root) {
            delete r;
            r = NULL;
        }
    }
}


int trie_pref (nod * r, char * s) {
    if (* s == 0) {
        return 1;
    }
    else {
        if (r -> v[* s - 'a'] == NULL)
            return 0;
        else
            return 1 + trie_pref (r -> v[* s - 'a'], s + 1);
    }
}

int main () {
    while (fin >> t >> w) {
        if (t == 0) {
            trie_add (root, w);
        }
        else if (t == 1) {
            trie_delete (root, w);
        }
        else if (t == 2) {
            fout << trie_check (root, w) << "\n";
        }
        else if (t == 3) {
            fout << trie_pref (root, w) << "\n";
        }
    }

    return 0;
}