Cod sursa(job #2650848)

Utilizator MarcGrecMarc Grec MarcGrec Data 20 septembrie 2020 14:25:57
Problema Hashuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#define HASH_MOD 1000003
#define HASH_FUNC(X) ((X) % HASH_MOD)

#include <fstream>
using namespace std;

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

struct node
{
	node(int _data, node* _previous = nullptr) : data(_data), previous(_previous)
	{
	}
	
	int data;
	node* previous;
};

node* HS[HASH_MOD] = {  };

void Insert(int data);

void Remove(int data);

bool LookUp(int data);

void Cleanup();

int main()
{
	int n;
	fin >> n;
	
	for (int i = 0; i < n; ++i)
	{
		int op, x;
		
		fin >> op >> x;
		
		switch (op)
		{
			case 1:
			{
				Insert(x);
				break;
			}
			case 2:
			{
				Remove(x);
				break;
			}
			case 3:
			{
				fout << LookUp(x) << '\n';
				break;
			}
		}
	}
	
	Cleanup();
	
	fin.close();
	fout.close();
	return 0;
}

void Insert(int data)
{
	if (!LookUp(data))
	{
		int hfuncRes = HASH_FUNC(data);
		
		node* last = HS[hfuncRes];
		
		node* newLast = new node(data, last);
			
		HS[hfuncRes] = newLast;
	}
}

void Remove(int data)
{
	int hfuncRes = HASH_FUNC(data);
	
	node* elem = HS[hfuncRes];
	node* next = nullptr;
	
	while (elem != nullptr)
	{
		if (elem->data == data)
		{
			if (next != nullptr)
			{
				next->previous = elem->previous;
			}
			else
			{
				HS[hfuncRes] = elem->previous;
			}
			
			delete elem;
			
			break;
		}
		
		next = elem;
		elem = elem->previous;
	}
}

bool LookUp(int data)
{
	int hfuncRes = HASH_FUNC(data);
	
	node* elem = HS[hfuncRes];
	
	while (elem != nullptr)
	{
		if (elem->data == data)
		{
			return true;
		}
		
		elem = elem->previous;
	}
	
	return false;
}

void Cleanup()
{
	for (int i = 0; i < HASH_MOD; ++i)
	{
		while (HS[i] != nullptr)
		{
			node* aux = HS[i];
			
			HS[i] = HS[i]->previous;
			
			delete aux;
		}
	}
}