Cod sursa(job #2029874)

Utilizator ioanailincaMoldovan Ioana Ilinca ioanailinca Data 30 septembrie 2017 16:10:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int SIGMA = 26; /// numarul literelor din alfabet

struct Trie {
    Trie() {
        numberOfWords = 0;
        numberOfSons = 0;
        memset(sons, 0, sizeof sons);
    }


    int numberOfWords, numberOfSons;
    Trie* sons[SIGMA];
};

Trie *root = new Trie;

void addWord(Trie* trieNode, char* p) {
    if (p[0] == 0) {
        trieNode->numberOfWords++;
        return;
    }

    if (trieNode->sons[p[0] - 'a'] == 0) {
        trieNode->sons[p[0] - 'a'] = new Trie;
        trieNode->numberOfSons++;
    }
    addWord(trieNode->sons[p[0] - 'a'], p + 1);
}

bool deleteWord(Trie* trieNode, char* p) {
    if (p[0] == 0)
        trieNode->numberOfWords--;
    else {
        if (deleteWord(trieNode->sons[p[0] - 'a'], p + 1)) {
            trieNode->sons[p[0] - 'a'] = 0;
            trieNode->numberOfSons--;
        }
    }

    if (trieNode->numberOfWords == 0 && trieNode->numberOfSons == 0 && trieNode != root) {
        delete trieNode;
        return 1;
    }
    return 0;
}

inline int getNumber(Trie* trieNode, char *p) {
    if (p[0] == 0)
        return trieNode->numberOfWords;

    if (trieNode->sons[p[0] - 'a'])
        return getNumber(trieNode->sons[p[0] - 'a'], p + 1);
    return 0;
}

inline int getPrefix(Trie* trieNode, char *p, int length) {
    if (p[0] == 0 || trieNode->sons[p[0] - 'a'] == 0)
        return length;
    return getPrefix(trieNode->sons[p[0] - 'a'], p + 1, length + 1);
}

int main()
{
    int op;
    char word[21] = {0};
    while (fin >> op >> word) {
        switch (op) {
            case 0: addWord(root, word); break;
            case 1: deleteWord(root, word); break;
            case 2: fout << getNumber(root, word) << '\n'; break;
            case 3: fout << getPrefix(root, word, 0) << '\n'; break;
        }
    }
    return 0;
}