/*
|r1 |r2 |r3
#|012 34|01 234|0 1234
0|111 00|00 001|0 0010
Massimo indice possibile:
0|111 00|00 011|0 0000 = 2^14+2^13+2^12+2^6+2^5 = 28768
*/
#include <stdio.h>
#define SIZE 28769
char combs[SIZE];
int *next;
void lookup_init()
{
}
/**
* Verifica che una chiave esista.
*
* @return -1 se non esiste, 0 se esiste (e poi dicono che non
* rispetto gli standard)
*/
int lookup_exists(
const int kFirst,
const int kSecond,
const int kThird,
int* firstRow,
int* secondRow,
int* thirdRow
) {
/* Gli esempi pratici sono:
1 combo) azbdce||dfef
2 combo) azbd|ce|dfef
3 combo) az|bdce|dfef
Quindi trasformo le "tabelle" in stringhe così da poterle convertire
in hash. */
int key = 0;
for ( int i = 0; i < kFirst; i++ ) {
key |= 1<<firstRow[ i ];
}
key = key<<5;
for ( int i = 0; i < kSecond; i++ ) {
key |= 1<<secondRow[ i ];
}
key = key<<5;
for ( int i = 0; i < kThird; i++ ) {
key |= 1<<thirdRow[ i ];
}
next = &combs[key];
if(*next == 0) {
return -1;
}
return 0;
}
void lookup_insert()
{
*next = 1;
}
void lookup_update()
{
++(*next);
}
void lookup_free()
{
}
int main(void)
{
/*
Ipotizzando di avere una tabella da 3 righe e 5 colonne:
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
e di riempirla casualmente (popolandola da sinistra a destra con un
indice che corrisponde ad una lettera della array "ab")
static char* ab[] = {
"az", "bd", "ce", "df", "ef", "fd", "gl"
*/
int _1row[5];
int _2row[5];
int _3row[5];
lookup_init();
/*
Prima combinazione:
+----+----+----+----+----+
| az | bd | ce | | |
+----+----+----+----+----+
| | | | | |
+----+----+----+----+----+
| df | ef | | | |
+----+----+----+----+----+
*/
_1row[0] = 0;
_1row[1] = 1;
_1row[2] = 2;
_3row[0] = 3;
_3row[1] = 4;
for ( int c = 0; c < 5; c++ ) {
/* Verifico che la combinazione esista già, se non esiste la creo
altrimenti aggiorno il campo "data".
In questo la prima combinazione avrà il campo "data" con il valore
4 (visto che incrementerà ad ogni "lookup_update") */
if ( lookup_exists( 3, 0, 2, _1row, _2row, _3row ) == -1 ) {
lookup_insert();
} else {
lookup_update();
}
}
/*
Seconda combinazione:
+----+----+----+----+----+
| az | bd | | | |
+----+----+----+----+----+
| ce | | | | |
+----+----+----+----+----+
| df | ef | | | |
+----+----+----+----+----+
Campo "data" con valore 1.
*/
_1row[0] = 0;
_1row[1] = 1;
_2row[0] = 2;
_3row[0] = 3;
_3row[1] = 4;
for ( int c = 0; c < 2; c++ ) {
if ( lookup_exists( 2, 1, 2, _1row, _2row, _3row ) == -1 ) {
lookup_insert();
} else {
lookup_update();
}
}
/*
Terza combinazione:
+----+----+----+----+----+
| az | | | | |
+----+----+----+----+----+
| bd | ce | | | |
+----+----+----+----+----+
| df | ef | | | |
+----+----+----+----+----+
Campo "data" con valore 2.
*/
_1row[0] = 0;
_2row[0] = 1;
_2row[1] = 2;
_3row[0] = 3;
_3row[1] = 4;
for ( int c = 0; c < 3; c++) {
if ( lookup_exists( 1, 2, 2, _1row, _2row, _3row ) == -1 ) {
lookup_insert();
} else {
lookup_update();
}
}
/*
Questa è sempre la seconda combinazione, perciò incrementa il campo
"data" di 15 valori.
*/
_1row[0] = 0;
_1row[1] = 1;
_2row[0] = 2;
_3row[0] = 3;
_3row[1] = 4;
for ( int c = 0; c < 15; c++ ) {
if ( lookup_exists( 2, 1, 2, _1row, _2row, _3row ) == -1 ) {
lookup_insert();
} else {
lookup_update();
}
}
lookup_free();
}
LyoKIHxyMSAgIHxyMiAgICAgIHxyMwojfDAxMiAzNHwwMSAgMjM0fDAgMTIzNAowfDExMSAwMHwwMCAgMDAxfDAgMDAxMAoKTWFzc2ltbyBpbmRpY2UgcG9zc2liaWxlOgowfDExMSAwMHwwMCAgMDExfDAgMDAwMCA9IDJeMTQrMl4xMysyXjEyKzJeNisyXjUgPSAyODc2OAoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFNJWkUgMjg3NjkKCmNoYXIgY29tYnNbU0laRV07CgppbnQgKm5leHQ7Cgp2b2lkIGxvb2t1cF9pbml0KCkKewp9CiAKLyoqCiAqIFZlcmlmaWNhIGNoZSB1bmEgY2hpYXZlIGVzaXN0YS4KICoKICogQHJldHVybiAgICAgIC0xIHNlIG5vbiBlc2lzdGUsIDAgc2UgZXNpc3RlIChlIHBvaSBkaWNvbm8gY2hlIG5vbgogKiAgICAgICAgICAgICAgcmlzcGV0dG8gZ2xpIHN0YW5kYXJkKQogKi8KaW50IGxvb2t1cF9leGlzdHMoCiAgICBjb25zdCBpbnQga0ZpcnN0LAogICAgY29uc3QgaW50IGtTZWNvbmQsCiAgICBjb25zdCBpbnQga1RoaXJkLAogICAgaW50KiBmaXJzdFJvdywKICAgIGludCogc2Vjb25kUm93LAogICAgaW50KiB0aGlyZFJvdwopIHsKIAogICAgLyogR2xpIGVzZW1waSBwcmF0aWNpIHNvbm86CiAgICAgICAxIGNvbWJvKSBhemJkY2V8fGRmZWYKICAgICAgIDIgY29tYm8pIGF6YmR8Y2V8ZGZlZgogICAgICAgMyBjb21ibykgYXp8YmRjZXxkZmVmCiAKICAgICAgIFF1aW5kaSB0cmFzZm9ybW8gbGUgInRhYmVsbGUiIGluIHN0cmluZ2hlIGNvc8OsIGRhIHBvdGVybGUgY29udmVydGlyZQogICAgICAgaW4gaGFzaC4gKi8KICAgIGludCBrZXkgPSAwOwogICAgZm9yICggaW50IGkgPSAwOyBpIDwga0ZpcnN0OyBpKysgKSB7CiAgICAgICAga2V5IHw9IDE8PGZpcnN0Um93WyBpIF07CiAgICB9CiAgICBrZXkgPSBrZXk8PDU7CiAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBrU2Vjb25kOyBpKysgKSB7CiAgICAgICAga2V5IHw9IDE8PHNlY29uZFJvd1sgaSBdOwogICAgfQogICAga2V5ID0ga2V5PDw1OwogICAgZm9yICggaW50IGkgPSAwOyBpIDwga1RoaXJkOyBpKysgKSB7CiAgICAgICAga2V5IHw9IDE8PHRoaXJkUm93WyBpIF07CiAgICB9CiAgICAKICAgIG5leHQgPSAmY29tYnNba2V5XTsKIAogICAgaWYoKm5leHQgPT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KIAogICAgcmV0dXJuIDA7Cn0KIAp2b2lkIGxvb2t1cF9pbnNlcnQoKQp7CiAgICAqbmV4dCA9IDE7Cn0KIAp2b2lkIGxvb2t1cF91cGRhdGUoKQp7CiAgICArKygqbmV4dCk7Cn0KIAp2b2lkIGxvb2t1cF9mcmVlKCkKewogICAgCn0KIAppbnQgbWFpbih2b2lkKQp7CiAgICAvKgogICAgICAgIElwb3RpenphbmRvIGRpIGF2ZXJlIHVuYSB0YWJlbGxhIGRhIDMgcmlnaGUgZSA1IGNvbG9ubmU6CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKIAogICAgICAgIGUgZGkgcmllbXBpcmxhIGNhc3VhbG1lbnRlIChwb3BvbGFuZG9sYSBkYSBzaW5pc3RyYSBhIGRlc3RyYSBjb24gdW4KICAgICAgICBpbmRpY2UgY2hlIGNvcnJpc3BvbmRlIGFkIHVuYSBsZXR0ZXJhIGRlbGxhIGFycmF5ICJhYiIpCiAKICAgICAgICBzdGF0aWMgY2hhciogYWJbXSA9IHsKICAgICAgICAgICAgImF6IiwgImJkIiwgImNlIiwgImRmIiwgImVmIiwgImZkIiwgImdsIgogICAgKi8KICAgIGludCBfMXJvd1s1XTsKICAgIGludCBfMnJvd1s1XTsKICAgIGludCBfM3Jvd1s1XTsKIAogICAgbG9va3VwX2luaXQoKTsKIAogICAgLyoKICAgICAgICBQcmltYSBjb21iaW5hemlvbmU6CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGF6IHwgYmQgfCBjZSB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgZGYgfCBlZiB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICovCiAgICBfMXJvd1swXSA9IDA7CiAgICBfMXJvd1sxXSA9IDE7CiAgICBfMXJvd1syXSA9IDI7CiAgICBfM3Jvd1swXSA9IDM7CiAgICBfM3Jvd1sxXSA9IDQ7CiAgICBmb3IgKCBpbnQgYyA9IDA7IGMgPCA1OyBjKysgKSB7CiAgICAgICAgLyogVmVyaWZpY28gY2hlIGxhIGNvbWJpbmF6aW9uZSBlc2lzdGEgZ2nDoCwgc2Ugbm9uIGVzaXN0ZSBsYSBjcmVvCiAgICAgICAgICAgYWx0cmltZW50aSBhZ2dpb3JubyBpbCBjYW1wbyAiZGF0YSIuCiAgICAgICAgICAgSW4gcXVlc3RvIGxhIHByaW1hIGNvbWJpbmF6aW9uZSBhdnLDoCBpbCBjYW1wbyAiZGF0YSIgY29uIGlsIHZhbG9yZQogICAgICAgICAgIDQgKHZpc3RvIGNoZSBpbmNyZW1lbnRlcsOgIGFkIG9nbmkgImxvb2t1cF91cGRhdGUiKSAqLwogICAgICAgIGlmICggbG9va3VwX2V4aXN0cyggMywgMCwgMiwgXzFyb3csIF8ycm93LCBfM3JvdyApID09IC0xICkgewogICAgICAgICAgICBsb29rdXBfaW5zZXJ0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9va3VwX3VwZGF0ZSgpOwogICAgICAgIH0KICAgIH0KIAogICAgLyoKICAgICAgICBTZWNvbmRhIGNvbWJpbmF6aW9uZToKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgYXogfCBiZCB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGNlIHwgICAgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCBkZiB8IGVmIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogCiAgICAgICAgQ2FtcG8gImRhdGEiIGNvbiB2YWxvcmUgMS4KICAgICovCiAgICBfMXJvd1swXSA9IDA7CiAgICBfMXJvd1sxXSA9IDE7CiAgICBfMnJvd1swXSA9IDI7CiAgICBfM3Jvd1swXSA9IDM7CiAgICBfM3Jvd1sxXSA9IDQ7CiAgICBmb3IgKCBpbnQgYyA9IDA7IGMgPCAyOyBjKysgKSB7CiAgICAgICAgaWYgKCBsb29rdXBfZXhpc3RzKCAyLCAxLCAyLCBfMXJvdywgXzJyb3csIF8zcm93ICkgPT0gLTEgKSB7CiAgICAgICAgICAgIGxvb2t1cF9pbnNlcnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb29rdXBfdXBkYXRlKCk7CiAKICAgICAgICB9CiAgICB9CiAKICAgIC8qCiAgICAgICAgVGVyemEgY29tYmluYXppb25lOgogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCBheiB8ICAgIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgYmQgfCBjZSB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGRmIHwgZWYgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAKICAgICAgICBDYW1wbyAiZGF0YSIgY29uIHZhbG9yZSAyLgogICAgKi8KICAgIF8xcm93WzBdID0gMDsKICAgIF8ycm93WzBdID0gMTsKICAgIF8ycm93WzFdID0gMjsKICAgIF8zcm93WzBdID0gMzsKICAgIF8zcm93WzFdID0gNDsKICAgIGZvciAoIGludCBjID0gMDsgYyA8IDM7IGMrKykgewogICAgICAgIGlmICggbG9va3VwX2V4aXN0cyggMSwgMiwgMiwgXzFyb3csIF8ycm93LCBfM3JvdyApID09IC0xICkgewogICAgICAgICAgICBsb29rdXBfaW5zZXJ0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9va3VwX3VwZGF0ZSgpOwogCiAgICAgICAgfQogICAgfQogCiAgICAvKgogICAgICAgIFF1ZXN0YSDDqCBzZW1wcmUgbGEgc2Vjb25kYSBjb21iaW5hemlvbmUsIHBlcmNpw7IgaW5jcmVtZW50YSBpbCBjYW1wbwogICAgICAgICJkYXRhIiBkaSAxNSB2YWxvcmkuCiAgICAqLwogICAgXzFyb3dbMF0gPSAwOwogICAgXzFyb3dbMV0gPSAxOwogICAgXzJyb3dbMF0gPSAyOwogICAgXzNyb3dbMF0gPSAzOwogICAgXzNyb3dbMV0gPSA0OwogICAgZm9yICggaW50IGMgPSAwOyBjIDwgMTU7IGMrKyApIHsKICAgICAgICBpZiAoIGxvb2t1cF9leGlzdHMoIDIsIDEsIDIsIF8xcm93LCBfMnJvdywgXzNyb3cgKSA9PSAtMSApIHsKICAgICAgICAgICAgbG9va3VwX2luc2VydCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvb2t1cF91cGRhdGUoKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHByaW50ZigiJWQiLCAqbmV4dCk7CgogICAgbG9va3VwX2ZyZWUoKTsKfQ==