Cod sursa(job #1251891)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 29 octombrie 2014 23:30:12
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <fstream>

#define Cmax 26
#define Smax 100
#define ord(x) (x - 'a')
#define nextNode node->Son[ord(*pointer)]

using namespace std;

struct Node {

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

    Node() {

        sonCount = wordCount = 0;

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

        }
    };

class Dictionary {

    private:
        Node * Root;

    public:

        Dictionary() {

            Root = new Node;

        }

        void insert(char * pointer) {

            Node * node = Root;

            while(*pointer) {

                if(nextNode == 0)
                    nextNode = new Node,
                    node->sonCount++;

                node = nextNode;
                pointer++;

                }

            node->wordCount++;

        }

        void remove(char * pointer) {

            remove(Root, pointer);

            }

        int count(char * pointer) {

            Node * node = Root;

            while(*pointer) {

                if(nextNode == 0)
                    return 0;

                node = nextNode;
                pointer++;

                }

            return node->wordCount;

            }

        int prefix(char * pointer) {

            Node * node = Root;
            int length = 0;

            while(*pointer) {

                if(nextNode == 0)
                    break;

                node = nextNode;
                pointer++;
                length++;

                }

            return length;

            }

    private:

        void remove(Node * node, char * pointer) {

            if(!*pointer)
                node->wordCount--;
            else {

                remove(nextNode, pointer + 1);

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

                }

        }

} D;

int main() {

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

    while(in.getline(line, Smax))
        switch(line[0]) {

            case '0':
                D.insert(line + 2);
                break;

            case '1':
                D.remove(line + 2);
                break;

            case '2':
                out << D.count(line + 2) << '\n';
                break;

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

            }

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

    return 0;

}