Pagini recente » Cod sursa (job #1730647) | Cod sursa (job #2368767) | Cod sursa (job #2186688) | Cod sursa (job #583419) | Cod sursa (job #868293)
Cod sursa(job #868293)
#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;
}