Pagini recente » Cod sursa (job #1051585) | Cod sursa (job #2783945) | Cod sursa (job #1652029) | Cod sursa (job #1682813) | Cod sursa (job #1413549)
#include <stdio.h>
#include <assert.h>
#define MOD 666013
#define NIL -1
unsigned h[2][MOD][5];
inline unsigned hash1(unsigned x) {
return x - x / MOD * MOD;
}
inline unsigned hash2(unsigned x) {
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x) * 0x45d9f3b;
x = ((x >> 16) ^ x);
return x - x / MOD * MOD;
}
inline void hashInsert(unsigned x) {
unsigned h0 = hash1(x);
unsigned h1 = hash2(x);
if (h[0][h0][0] <= h[1][h1][0]) {
assert(h[0][h0][0] < 4);
h[0][h0][++h[0][h0][0]] = x;
} else {
assert(h[1][h1][0] < 4);
h[1][h1][++h[1][h1][0]] = x;
}
}
inline void hashRemove(unsigned x) {
unsigned h0 = hash1(x);
unsigned h1 = hash2(x);
unsigned i;
i = 0;
while ((i <= h[0][h0][0]) && (h[0][h0][i] != x)) {
i++;
}
if (i <= h[0][h0][0]) {
for (; i < h[0][h0][0]; i++) {
h[0][h0][i] = h[0][h0][i + 1];
}
h[0][h0][0]--;
} else {
i = 0;
while ((i <= h[1][h1][0]) && (h[1][h1][i] != x)) {
i++;
}
if (i <= h[1][h1][0]) {
for (; i < h[1][h1][0]; i++) {
h[1][h1][i] = h[1][h1][i + 1];
}
h[1][h1][0]--;
}
}
}
inline bool hashFind(unsigned x) {
unsigned h0 = hash1(x);
unsigned h1 = hash2(x);
unsigned i;
i = 0;
while ((i <= h[0][h0][0]) && (h[0][h0][i] != x)) {
i++;
}
if (i <= h[0][h0][0]) {
return 1;
}
i = 0;
while ((i <= h[1][h1][0]) && (h[1][h1][i] != x)) {
i++;
}
return (i <= h[1][h1][0]);
}
int main(void) {
FILE *f, *g;
unsigned query, x;
register unsigned i;
f = fopen("hash.in", "r");
fscanf(f, "%u ", &query);
g = fopen("hash.out", "w");
for (i = 0; i < query - 3; i += 4) {
char c = fgetc(f);
fscanf(f, "%u ", &x);
switch (c) {
case '1':
hashInsert(x);
break;
case '2':
hashRemove(x);
break;
case '3':
fputc(hashFind(x) + '0', g);
fputc('\n', g);
break;
}
c = fgetc(f);
fscanf(f, "%u ", &x);
switch (c) {
case '1':
hashInsert(x);
break;
case '2':
hashRemove(x);
break;
case '3':
fputc(hashFind(x) + '0', g);
fputc('\n', g);
break;
}
c = fgetc(f);
fscanf(f, "%u ", &x);
switch (c) {
case '1':
hashInsert(x);
break;
case '2':
hashRemove(x);
break;
case '3':
fputc(hashFind(x) + '0', g);
fputc('\n', g);
break;
}
c = fgetc(f);
fscanf(f, "%u ", &x);
switch (c) {
case '1':
hashInsert(x);
break;
case '2':
hashRemove(x);
break;
case '3':
fputc(hashFind(x) + '0', g);
fputc('\n', g);
break;
}
}
for (; i < query; i++) {
char c = fgetc(f);
fscanf(f, "%u ", &x);
switch (c) {
case '1':
hashInsert(x);
break;
case '2':
hashRemove(x);
break;
case '3':
fputc(hashFind(x) + '0', g);
fputc('\n', g);
break;
}
}
fclose(f);
fclose(g);
return 0;
}