Cod sursa(job #868293)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 30 ianuarie 2013 21:30:20
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>

using namespace std;

#define clasa 524287 //2^19-1, care este numar un destul de mare, rar si prim

//O stiva din tabela de hashuri
struct nod
{
	int val;
	nod *ante;
};

//Tabela hash
nod *v[clasa+1];

//Verifica daca exista in tabela valoarea x
bool exista(int x)
{
	nod *p;
	
	bool gasit=false;
	
	for(p=v[x%clasa];p!=NULL;p=p->ante)
		if(p->val==x)
		{
			gasit=true;
			break;
		}
		
	if(gasit)
		return 1;
	return 0;
}

//Adauga valoare x in tabela
void push(int x)
{
	//Daca exista nu facem nimic
	if(exista(x))
		return;
	
	//Cream un nou nod si ii dam valoare si referinta corecta pentru adeveni varful stivei
	nod *p=new nod;
	
	p->val=x;
	p->ante=v[x%clasa];
	
	v[x%clasa]=p;
}

//Elimina din tabela un element
void pop(int x)
{
	//t va fi predecesorul lui p, care va fi un contor printr-o stiva
	nod *p=new nod;
	nod *t=new nod;
	
	//Vedem daca solutia e in varf
	if(v[x%clasa]!=NULL)
		if(v[x%clasa]->val==x)
		{
			v[x%clasa]=v[x%clasa]->ante;
			return;
		}
	
	//Parcurgem stiva si vedem daca gasim elementul pentru al sterge
	for(p=v[x%clasa];p!=NULL;p=p->ante)
	{
		//Daca l-am gasit, il stergem si iesim din functie
		if(p->val==x)
		{
			//Daca t nu e NULL, caci lui NULL nu ii putem atribui nimic si nici nu trebuie
			if(t!=NULL) //Interesant ca se pot lua 40 de puncte pentru t==NULL
				t->ante=p->ante;
			break;
		}
		
		//t este mereu inainte de p-ul curent
		t=p;
	}
}

int main()
{
	//Deschiderea fisierelor de intrare si iesire
	ifstream fin("hashuri.in");
	ofstream fout("hashuri.out");
	
	//n - numarul de cereri, x si y elementele cererii iar i contor
	int n,x,y,i;
	
	//Citim n si solutionam cererile
	fin>>n;
	
	for(i=0;i<n;i++)
	{
		fin>>x;
		fin>>y;
		
		//Cazualistica din enunt
		if(x==1)
			push(y);
		else if(x==2)
			pop(y);
		else
			fout<<exista(y)<<'\n';
	}
	
	//Inchiderea fisierelor de intrare si iesire
	fin.close();
	fout.close();
	return 0;
}