Cod sursa(job #913075)

Utilizator vladm97Matei Vlad vladm97 Data 13 martie 2013 08:59:50
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include<fstream>
#include<time.h>
#include<iostream>
#include <stdlib.h>
#define size 500000
#define prim 18593
using namespace std;
int a1,a2,*v1,*v2;
  
void aloca(){
    v1=(int*)calloc(size,sizeof(int));
    v2=(int*)calloc(size,sizeof(int));
}
 void null(){
     int i;
     for(i=0;i<size;i++)
         v1[i]=v2[i]=0;
 }
int h1(int x){
    long long c;
    c=(((long long) x*(long long)(a1%10)+(long long)x%a2)+(long long)x*5)%size;
    return c;
}
  
int h2(int x){
    long long c;
   c=(((long long)x*((long long)(a1%10))%prim)+(long long)x*(long long)(a1%10))%size;
   return c;
}
  
void reset(){
    a1=rand()%prim;
    a2=rand()%prim;
}
  
int cautare(int x){
    if(v1[h1(x)]==x)return 1;
    if(v2[h2(x)]==x)return 1;
    return 0;
}
 
int inserare(int x){
    if(cautare(x)==1)return 1;
    int k=0,aux;
    while(k<30){
        if(v1[h1(x)]==0){
            v1[h1(x)]=x;
            return 1;}
        else if(v2[h2(x)]==0){
            v2[h2(x)]=x;
            return 1;}
        else{
            k++;
            if(k%2==1){
                aux=v1[h1(x)];
                v1[h1(x)]=x;
                x=aux;}
            else{
                aux=v2[h2(x)];
                v2[h2(x)]=x;
                x=aux;}
        }
    }
    return 0;
}
         
void sterge(int x){
    if(v1[h1(x)]==x)v1[h1(x)]=0;
    else if(v2[h2(x)]==x)v2[h2(x)]=0;
}
 
void rehash(int k){
    reset();
    null();
    int i,op,x;
    ifstream f("hahsuri.in");
    f>>i;
    for(i=1;i<=k;i++){
        f>>op>>x;
        if(op==1)
            if(inserare(x)==0)rehash(k);
        if(op==2){
            if(cautare(x)==1)
                sterge(x);
        }
    }
    f.close();
}
     
main(){
    srand(time(NULL));
    int n,i,op,x;
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
    f>>n;
    aloca();
    reset();
    for(i=1;i<=n;i++){
        f>>op>>x;
        if(op==1)
            {if(inserare(x)==0)rehash(i);}
        if(op==2){
            if(cautare(x)==1)
                sterge(x);
        }
        if(op==3){
                if(cautare(x)==1)
                    g<<1<<"\n";
                else g<<0<<"\n";
        }
    }       
}