Pagini recente » Cod sursa (job #675871) | Cod sursa (job #1775552) | Cod sursa (job #1715366) | Cod sursa (job #1245397) | Cod sursa (job #1173313)
#include <fstream>
#include <cstdlib>
using namespace std;
const int nil = 0x3f3f3f3f;
const double maxLoadFactor = 0.7;
class HashTable{
int* hash;
int size, cap, mod;
template<class Type>
inline static void swap(Type& a, Type& b){
Type c = a;
a = b;
b = c;
}
inline static bool prime(int x){
int i = 2;
while ( i * i <= x && x % i )
i++;
return i * i > x;
}
inline static int nextPrime(int x){
return prime(x) ? x : nextPrime(x + 1);
}
int lookup(int x){
if ( maxLoadFactor * cap < size ){
HashTable H( cap << 1, mod << 1 );
for (int i = 0 ; i < cap ; i++)
if ( hash[i] && hash[i] != nil )
H.insert( hash[i] );
swap(H, *this);
}
int poz = x % cap, step = 1 + x % mod;
while ( hash[poz] && hash[poz] != x )
poz = (poz + step) % cap;
return poz;
}
public:
HashTable(){
hash = (int*)calloc(7, sizeof(int));
cap = 7;
mod = 3;
size = 0;
}
HashTable(int n, int m){
hash = (int*)calloc(n, sizeof(int));
cap = nextPrime(n);
mod = nextPrime(m);
size = 0;
}
void insert(int x){
int poz = lookup(x);
if ( hash[poz] != x ){
hash[poz] = x;
size++;
}
}
bool contains(int x){
int poz = lookup(x);
return hash[poz] == x;
}
void erase(int x){
int poz = lookup(x);
if (hash[poz] == x){
hash[poz] = nil;
size--;
}
}
~HashTable(){
free(hash);
}
};
int main(){
int times, tip, x;
HashTable H;
ifstream in("hashuri.in");
ofstream out("hashuri.out");
in >> times;
while (times--){
in >> tip >> x;
if (tip == 1)
H.insert(x);
if (tip == 2)
H.erase(x);
if (tip == 3)
out << H.contains(x) << '\n';
}
in.close();
out.close();
return 0;
}