Cod sursa(job #1341238)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 12 februarie 2015 16:12:23
Problema Hashuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 7.71 kb
#include <fstream>
#include <iostream>

using namespace std;

template <typename T>
class Deque {

    private:
        struct Node {

            T item;
            Node * prev, * next;

            Node(T newItem) {
                prev = next = nullptr;
                item = newItem;
            }
        };

        Node * first, * last;

    public:
        Deque() {
            first = last = nullptr;
        }

        void push_front(T newItem) {

            Node * node = new Node(newItem);

            if(first == nullptr)
                first = last = node;
            else {
                first->prev = node;
                node->next = first;
                first = node;
            }
        }

        void pop_front() {

            if(first == nullptr)
                return;

            if(first->next == nullptr)
                first = last = nullptr;
            else {
                first = first->next;
                delete first->prev;
                first->prev = nullptr;
            }
        }

        void push_back(T newItem) {

            Node * node = new Node(newItem);

            if(last == nullptr)
                first = last = node;
            else {
                last->next = node;
                node->prev = last;
                last = node;
            }
        }

        void pop_back() {

            if(last == nullptr)
                return;

            if(last->prev == nullptr)
                first = last = nullptr;
            else {
                last = last->prev;
                delete last->next;
                last->next = nullptr;
            }
        }

        Node * begin() {
            return first;
        }

        Node * end() {
            return last;
        }

        T front() {
            return first->item;
        }

        T back() {
            return last->item;
        }

        bool empty() {
            return (first == nullptr);
        }
};

template <typename T>
class Queue {

    private:
        struct Node {

            T item;
            Node * next;

            Node(T newItem) {
                next = nullptr;
                item = newItem;
            }
        };

        Node * first, * last;

    public:
        Queue() {
            first = last = nullptr;
        }

        void push(T newItem) {

            Node * node = new Node(newItem);

            if(last == nullptr)
                first = last = node;
            else {
                last->next = node;
                last = node;
            }
        }

        void pop() {

            if(first == nullptr)
                return;

            Node * node = first;

            if(first->next == nullptr)
                first = last = nullptr;
            else
                first = first->next;

            delete node;
        }

        T front() {
            return first->item;
        }

        T end() {
            return last->item;
        }

        bool empty() {
            return (last == nullptr);
        }
};

template <typename T>
class Stack {

    private:
        struct Node {

            T item;
            Node * prev;

            Node(T newItem) {
                prev = nullptr;
                item = newItem;
            }
        };

        Node * last;

    public:
        Stack() {
            last = nullptr;
        }

        void push(T newItem) {

            Node * node = new Node(newItem);
            node->prev = last;
            last = node;
        }

        void pop() {

            if(last == nullptr)
                return;

            Node * node = last->prev;
            delete last;
            last = node;
            }

        T top() {
            return last->item;
        }

        bool empty() {
            return (last == nullptr);
        }
};

class Hash {

    #define mod 2000001

    private:
        struct Node {
            int key;
            short state;
            Node() {
                state = 0;
            }
        };

        Node H[mod];

        int findSlot(int key, int constraint1, int constraint2) {

            int index = key % mod;

            while(H[index].state != constraint1 && H[index].state != constraint2 && H[index].key != key) {
                ++index;
                if(index == mod)
                    index = 0;
            }

            return index;
        }

    public:
        Hash() {
        }

        void insert(int key) {

            int index = findSlot(key, -1, 0);
            H[index].key = key;
            H[index].state = 1;
        }

        bool search(int key) {
            return (H[findSlot(key, 0, 0)].key == key);
        }

        void remove(int key) {

            int index = findSlot(key, 0, 0);

            if(H[index].state != 0) {
                H[index].key = -1;
                H[index].state = -1;
            }
        }
} h;

template <typename T>
class binarySearchTree {

    private:
        struct Node {

            T key;
            Node * left, * right;

            Node() {
                left = right = nullptr;
            }
        };

        Node * root;

        Node * insert(Node * node, T & newKey) {

            if(node == nullptr) {
                node = new Node;
                node->key = newKey;
                return node;
            }

            if(newKey < node->key)
                node->left = insert(node->left, newKey);
            if(node->key < newKey)
                node->right = insert(node->right, newKey);

            return node;
        }

        bool search(Node * node, T & key) {

            if(node == nullptr)
                return false;

            if(node->key == key)
                return true;
            else
            if(key < node->key)
                return search(node->left, key);
            else
                return search(node->right, key);
        }

        Node * erase(Node * node, T & key) {

            if(node == nullptr)
                return nullptr;

            if(node->key == key) {

                Node * p;

                if(node->left == nullptr || node->right == nullptr) {
                    p = (node->left == nullptr ? node->right : node->left);
                    delete node;
                    return p;
                }

                for(p = node->left; p->right != nullptr; p = p->right);

                node->key = p->key;
                node->left = erase(node->left, node->key);
            }
            else
            if(key < node->key)
                node->left = erase(node->left, key);
            else
                node->right = erase(node->right, key);

            return node;
        }

    public:
        binarySearchTree() {
            root = nullptr;
        }

        void insert(T newKey) {
            root = insert(root, newKey);
        }

        bool search(T key) {
            return search(root, key);
        }

        void erase(T key) {
            root = erase(root, key);
        }
};

int main() {

    int type, x, queries;
    binarySearchTree <int> bst;

    ifstream in("hashuri.in");
    ofstream out("hashuri.out");

    in >> queries;

    while(queries--) {

        in >> type >> x;

        switch(type) {
            case 1: bst.insert(x); break;
            case 2: bst.erase(x); break;
            case 3: out << (bst.search(x) == 1 ? '1' : '0') << '\n';
            }

        }

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

    return 0;
}