Cod sursa(job #905028)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 5 martie 2013 13:42:46
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

#define MOD 666013
  
vector <int> v[MOD];

inline int hash(int a)
{
	a = (a ^ 61) ^ (a >> 16);
    a = a + (a << 3);
    a = a ^ (a >> 4);
    a = a * 0x27d4eb2d;
    a = a ^ (a >> 15);
	if(a>=0)
		return a%MOD;
	else return (-a)%MOD;
}
  
int cauta(int k, int x)
{
    int i,n;
    n=int(v[k].size())-1;
    for(i=0;i<=n;i++)
        if(v[k][i]==x)
            return i;
    return -1;
}
  
void adauga(int k, int x)
{
    if(cauta(k,x)==-1)
        v[k].push_back(x);
}
  
void sterge(int k, int x)
{
    int poz;
    poz=cauta(k,x);
    if(poz!=-1) 
        v[k].erase(v[k].begin()+poz);
}
int main ()
{
    int n,i,op,x;
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
    f>>n;
    for(i=1;i<=n;i++) {
        f>>op>>x;
        if(op==1)
            adauga(hash(x),x);
        else if(op==2)
            sterge(hash(x),x);
        else {
            if(cauta(hash(x),x)==-1)
                g<<"0"<<'\n';
            else g<<"1"<<'\n';
        }
    }
    f.close();
    g.close();
}

/*
#define hashsize(n) ( 1U << (n) )
#define hashmask(n) ( hashsize ( n ) - 1 )
  
#define mix(a,b,c) \
{ \
	a -= b; a -= c; a ^= ( c >> 13 ); \
    b -= c; b -= a; b ^= ( a << 8 ); \
	c -= a; c -= b; c ^= ( b >> 13 ); \
	a -= b; a -= c; a ^= ( c >> 12 ); \
	b -= c; b -= a; b ^= ( a << 16 ); \
	c -= a; c -= b; c ^= ( b >> 5 ); \
	a -= b; a -= c; a ^= ( c >> 3 ); \
	b -= c; b -= a; b ^= ( a << 10 ); \
	c -= a; c -= b; c ^= ( b >> 15 ); \
}

unsigned jen_hash ( unsigned char *k, unsigned length, unsigned initval ) {
	unsigned a, b;	
	unsigned c = initval;
	unsigned len = length;
	a = b = 0x9e3779b9;
	while ( len >= 12 ) {
		a += ( k[0] + ( (unsigned)k[1] << 8 ) + ( (unsigned)k[2] << 16 ) + ( (unsigned)k[3] << 24 ) );
		b += ( k[4] + ( (unsigned)k[5] << 8 ) + ( (unsigned)k[6] << 16 ) + ( (unsigned)k[7] << 24 ) );
		c += ( k[8] + ( (unsigned)k[9] << 8 ) + ( (unsigned)k[10] << 16 ) + ( (unsigned)k[11] << 24 ) );
		mix ( a, b, c );
		k += 12;	
		len -= 12;
    }
 
    c += length;
 
    switch ( len ) {
		case 11: c += ( (unsigned)k[10] << 24 );
		case 10: c += ( (unsigned)k[9] << 16 );
		case 9 : c += ( (unsigned)k[8] << 8 );
		case 8 : b += ( (unsigned)k[7] << 24 );
		case 7 : b += ( (unsigned)k[6] << 16 );
		case 6 : b += ( (unsigned)k[5] << 8 );
		case 5 : b += k[4];
		case 4 : a += ( (unsigned)k[3] << 24 );
		case 3 : a += ( (unsigned)k[2] << 16 );
		case 2 : a += ( (unsigned)k[1] << 8 );  
		case 1 : a += k[0];
	}
	
	mix ( a, b, c );
	
	return c;
}
*/