Cod sursa(job #3131388)

Utilizator RadushCordunianu Radu Radush Data 19 mai 2023 23:03:12
Problema Hashuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define dim 666013
using namespace std;
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
struct Nod {
    int k,v;
    Nod* next;
    Nod(int k,int c):k(k),v(c),next(nullptr){}
};
class Hash {
private:
    vector<Nod*> t;
    static int hash(int key){
        return key%dim;
    }
public:
    Hash() {
        t.resize(dim, nullptr);
    }
    void insert(int val) {
        int index=hash(val);
        Nod* newNod=new Nod(val, 1);
        if (t[index]==nullptr) {
            t[index]=newNod;
        }
        else {
            Nod* curr=t[index];
            while (curr->next!=nullptr) {
                if (curr->k==val) {
                    curr->v++;
                    delete newNod;
                    return;
                }
                curr=curr->next;
            }
            if (curr->k==val) {
                curr->v++;
                delete newNod;
                return;
            }
            curr->next=newNod;
        }
    }
    void remove(int val) {
        int index=hash(val);
        if (t[index]==nullptr) {
            return;
        }
        Nod* curr=t[index];
        Nod* prev=nullptr;
        while (curr!=nullptr){
            if (curr->k==val){
                curr->v--;
                if (curr->v==0) {
                    if (prev!=nullptr) {
                        prev->next=curr->next;
                    } else {
                        t[index]=curr->next;
                    }
                    delete curr;
                }
                return;
            }
            prev=curr;
            curr=curr->next;
        }
    }

    bool getval(int val) {
        int index=hash(val);
        Nod* curr=t[index];
        while (curr!=nullptr) {
            if (curr->k==val) {
                return true;
            }
            curr=curr->next;
        }
        return false;
    }
};
int main() {
    Hash h;
    int n,op,x;
    fin>>n;
    for(int i=0;i<n;i++){
        fin>>op>>x;
        switch(op){
            case 1:
                h.insert(x);
                break;
            case 2:
                h.remove(x);
                break;
            case 3:
                fout<<h.getval(x)<<"\n";
                break;
            default:
                break;
        }
    }
    return 0;
}