Cod sursa(job #1332478)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 2 februarie 2015 01:56:08
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include <fstream>

#define Cmax 26
#define ord(x) (x - 97)
#define nextNode node->Son[ord(*p)]

using namespace std;

class Dictionary {

    private:
        struct Node {

            int sonCount, wordCount;
            Node * Son[Cmax];

            Node() {
                wordCount = sonCount = 0;

                for(int i = 0; i < Cmax; i++)
                    Son[i] = NULL;
                }
        };

        Node * root;

        void erase(Node * node, char * p) {

            if(*p == 0)
                node->wordCount--;
            else {
                erase(nextNode, p + 1);

                if(nextNode->wordCount == 0 && nextNode->sonCount == 0) {
                    delete nextNode;
                    nextNode = NULL;
                    node->sonCount--;
                }
            }
        }

    public:
        Dictionary() {
            root = new Node;
        }

        void insert(char * p) {

            Node * node = root;

            while(*p) {

                if(nextNode == NULL) {
                    nextNode = new Node;
                    node->sonCount++;
                }

                node = nextNode;
                p++;
            }

            node->wordCount++;
        }

        void erase(char * p) {
            erase(root, p);
        }

        int search(char * p) {

            Node * node = root;

            while(*p) {

                if(nextNode == NULL)
                    return 0;

                node = nextNode;
                p++;
            }

            return node->wordCount;
        }

        int prefix(char * p) {

            int length = 0;
            Node * node = root;

            while(*p) {

                if(nextNode == NULL)
                    break;

                node = nextNode;
                length++;
                p++;
            }

            return length;
        }
} dictionary;

int main() {

    char line[Cmax];
    ifstream in("trie.in");
    ofstream out("trie.out");

    while(in.getline(line, Cmax))
        switch(line[0]) {
            case '0':
                dictionary.insert(line + 2);
                break;

            case '1':
                dictionary.erase(line + 2);
                break;

            case '2':
                out << dictionary.search(line + 2) << '\n';
                break;

            case '3':
                out << dictionary.prefix(line + 2) << '\n';
        }

    in.close();
    out.close();

    return 0;

}