Cod sursa(job #907479)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 7 martie 2013 23:15:23
Problema Hashuri Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.74 kb
#include <fstream>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#define prim2 251003
#define prim1 350107
#define sizet1 670000
#define sizet2 400000


using namespace std;

int random1,random2,nr;
int h1(int &value,int random)
{
    return value%random;
}


int find_it(int value,int *T1, int *T2 )
{
    int hash1=h1(value,random1);
    int hash2=h1(value,random2);
    if (T1[hash1]==value || T2[hash2]==value)
        return 1;
    else return 0;
}


bool erase_it(int value,int *T1,int *T2)
{
    int hash1=h1(value,random1);
    int hash2=h1(value,random2);
    if (T1[hash1]==value)
    {
        T1[hash1]=0;
        return true;
    }
    if (T2[hash2]==value)
    {
        T2[hash2]=0;
        return true;

    }
    return false;

}


 bool insert_it(int value, int *T1, int *T2)
{
    int aux;
    int hash1 = h1(value,random1);
    int hash2 = h1(value,random2);
    if (find_it(value,T1,T2))
        return true;// ed eja in hash
    bool place = 1;
    for(int i=1;i<=50;i++)
    {
        if(T1[hash1]==0)
        {
            T1[hash1]=value;
            return true;
        }
        else
        if(T2[hash2]==0)
        {
            T2[hash2]=value;
            return true;
        }
        else
        {
            aux=T2[hash2];
            T2[hash2]=value;
            value=aux;
        }
    }
    return false;
}
void rehash(int *T1, int *T2,int *ope, int *values)
{
    delete T1;
    delete T2;
    random1=prim1 +rand() % (sizet1-prim1);
    random2=prim2 +rand() % (sizet2-prim2);
    T1=new int[sizet1+2];
    T2=new int[sizet2+2];
    for (int i=0;i<nr;i++)
    {
        if (ope[i]==true)
            insert_it(values[i],T1,T2);
        else
            erase_it(values[i],T1,T2);
    }

}
int main()
{   int n,op,i,x;
    srand(time(NULL));
    random1=prim1 +rand() % (sizet1-prim1);
    random2=prim2 +rand() % (sizet2-prim2);
    ifstream in("hashuri.in");
    ofstream out("hashuri.out");
    in>>n;
    int *T1= new int[sizet1+2];
    int *T2= new int[sizet2+2];
    int *ope=new int[n];
    int *values=new int[n];
    // iau vectorul op daca operatia e de adaugare op[i]=true else daca e de sterge op[i]=false;
    for (i=0;i<n;i++)
    {
        in>>op;
       if (op==1)
       {
           in>>x;
           ope[nr]=true;
           values[nr++]=x;
           if (insert_it(x,T1,T2)==false)
                rehash(T1,T2,ope,values);

       }
       else
      if (op==2)
      {
          in>>x;
          ope[nr]=false;
          values[nr++]=x;
          int ok1=erase_it(x,T1,T2);
      }
      else
        {
            in>>x;
            out<<find_it(x,T1,T2)<<'\n';
        }
    }
    return 0;
}