#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef union {
int data;
int next[6]; //5 valori + separatore
} node;
int size, capacity;
node *trie;
int next;
void lookup_init()
{
size = capacity = 1;
trie
= (node
*)calloc(sizeof(node
), size
);}
/**
* 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
) {
next = 0;
for ( int i = 0; i < kFirst; i++ ) {
next = trie[next].next[firstRow[ i ]];
if(next == 0) return -1;
}
next = trie[next].next[5]; //separatore
for ( int i = 0; i < kSecond; i++ ) {
if(next == 0) return -1;
next = trie[next].next[secondRow[ i ]];
}
next = trie[next].next[5]; //separatore
for ( int i = 0; i < kThird; i++ ) {
if(next == 0) return -1;
next = trie[next].next[thirdRow[ i ]];
}
if(next == 0) return -1;
return 0;
}
int alloc() {
if(size == capacity) {
capacity *= 2;
trie
= (node
*)realloc(trie
, sizeof(node
)*capacity
); }
memset(&trie
[size
], 0, sizeof(node
)); return size++;
}
void lookup_update(
const int kFirst,
const int kSecond,
const int kThird,
int* firstRow,
int* secondRow,
int* thirdRow
)
{
int tmp;
next = 0;
for ( int i = 0; i < kFirst; i++ ) {
tmp = trie[next].next[firstRow[ i ]];
if(tmp == 0) {
tmp = alloc();
trie[next].next[firstRow[ i ]] = tmp;
}
next = tmp;
}
tmp = trie[next].next[5];
if(tmp == 0) {
tmp = alloc();
trie[next].next[5] = tmp;
}
next = tmp;
for ( int i = 0; i < kSecond; i++ ) {
tmp = trie[next].next[secondRow[ i ]];
if(tmp == 0) {
tmp = alloc();
trie[next].next[secondRow[ i ]] = tmp;
}
next = tmp;
}
tmp = trie[next].next[5];
if(tmp == 0) {
tmp = alloc();
trie[next].next[5] = tmp;
}
next = tmp;
for ( int i = 0; i < kThird; i++ ) {
tmp = trie[next].next[thirdRow[ i ]];
if(tmp == 0) {
tmp = alloc();
trie[next].next[thirdRow[ i ]] = tmp;
}
next = tmp;
}
++(trie[next].data);
}
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") */
lookup_update( 3, 0, 2, _1row, _2row, _3row );
}
/*
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++ ) {
lookup_update( 2, 1, 2, _1row, _2row, _3row );
}
/*
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++) {
lookup_update( 1, 2, 2, _1row, _2row, _3row );
}
/*
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++ ) {
lookup_update( 2, 1, 2, _1row, _2row, _3row );
}
printf("%d", trie
[next
].
data);
lookup_free();
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiB1bmlvbiB7CiAgICBpbnQgZGF0YTsKICAgIGludCBuZXh0WzZdOyAvLzUgdmFsb3JpICsgc2VwYXJhdG9yZQp9IG5vZGU7CgppbnQgc2l6ZSwgY2FwYWNpdHk7Cm5vZGUgKnRyaWU7CgppbnQgbmV4dDsKCnZvaWQgbG9va3VwX2luaXQoKQp7CiAgICBzaXplID0gY2FwYWNpdHkgPSAxOwogICAgdHJpZSA9IChub2RlICopY2FsbG9jKHNpemVvZihub2RlKSwgc2l6ZSk7Cn0KIAovKioKICogVmVyaWZpY2EgY2hlIHVuYSBjaGlhdmUgZXNpc3RhLgogKgogKiBAcmV0dXJuICAgICAgLTEgc2Ugbm9uIGVzaXN0ZSwgMCBzZSBlc2lzdGUgKGUgcG9pIGRpY29ubyBjaGUgbm9uCiAqICAgICAgICAgICAgICByaXNwZXR0byBnbGkgc3RhbmRhcmQpCiAqLwppbnQgbG9va3VwX2V4aXN0cygKICAgIGNvbnN0IGludCBrRmlyc3QsCiAgICBjb25zdCBpbnQga1NlY29uZCwKICAgIGNvbnN0IGludCBrVGhpcmQsCiAgICBpbnQqIGZpcnN0Um93LAogICAgaW50KiBzZWNvbmRSb3csCiAgICBpbnQqIHRoaXJkUm93CikgewogICAgbmV4dCA9IDA7CiAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBrRmlyc3Q7IGkrKyApIHsKICAgICAgICBuZXh0ID0gdHJpZVtuZXh0XS5uZXh0W2ZpcnN0Um93WyBpIF1dOwogICAgICAgIGlmKG5leHQgPT0gMCkgcmV0dXJuIC0xOwogICAgfQogICAgbmV4dCA9IHRyaWVbbmV4dF0ubmV4dFs1XTsgLy9zZXBhcmF0b3JlCiAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBrU2Vjb25kOyBpKysgKSB7CiAgICAgICAgaWYobmV4dCA9PSAwKSByZXR1cm4gLTE7CiAgICAgICAgbmV4dCA9IHRyaWVbbmV4dF0ubmV4dFtzZWNvbmRSb3dbIGkgXV07CiAgICB9CiAgICBuZXh0ID0gdHJpZVtuZXh0XS5uZXh0WzVdOyAvL3NlcGFyYXRvcmUKICAgIGZvciAoIGludCBpID0gMDsgaSA8IGtUaGlyZDsgaSsrICkgewogICAgICAgIGlmKG5leHQgPT0gMCkgcmV0dXJuIC0xOwogICAgICAgIG5leHQgPSB0cmllW25leHRdLm5leHRbdGhpcmRSb3dbIGkgXV07CiAgICB9CiAgICBpZihuZXh0ID09IDApIHJldHVybiAtMTsgCiAgICByZXR1cm4gMDsKfQoKaW50IGFsbG9jKCkgewogICAgaWYoc2l6ZSA9PSBjYXBhY2l0eSkgewogICAgICAgIGNhcGFjaXR5ICo9IDI7CiAgICAgICAgdHJpZSA9IChub2RlICopcmVhbGxvYyh0cmllLCBzaXplb2Yobm9kZSkqY2FwYWNpdHkpOwogICAgfQogICAgbWVtc2V0KCZ0cmllW3NpemVdLCAwLCBzaXplb2Yobm9kZSkpOwogICAgcmV0dXJuIHNpemUrKzsKfQogCnZvaWQgbG9va3VwX3VwZGF0ZSgKICAgIGNvbnN0IGludCBrRmlyc3QsCiAgICBjb25zdCBpbnQga1NlY29uZCwKICAgIGNvbnN0IGludCBrVGhpcmQsCiAgICBpbnQqIGZpcnN0Um93LAogICAgaW50KiBzZWNvbmRSb3csCiAgICBpbnQqIHRoaXJkUm93CikKewogICAgaW50IHRtcDsKICAgIG5leHQgPSAwOwogICAgZm9yICggaW50IGkgPSAwOyBpIDwga0ZpcnN0OyBpKysgKSB7CiAgICAgICAgdG1wID0gdHJpZVtuZXh0XS5uZXh0W2ZpcnN0Um93WyBpIF1dOwogICAgICAgIGlmKHRtcCA9PSAwKSB7CiAgICAgICAgICAgIHRtcCA9IGFsbG9jKCk7CiAgICAgICAgICAgIHRyaWVbbmV4dF0ubmV4dFtmaXJzdFJvd1sgaSBdXSA9IHRtcDsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRtcDsKICAgIH0KICAgIHRtcCA9IHRyaWVbbmV4dF0ubmV4dFs1XTsKICAgIGlmKHRtcCA9PSAwKSB7CiAgICAgICAgdG1wID0gYWxsb2MoKTsKICAgICAgICB0cmllW25leHRdLm5leHRbNV0gPSB0bXA7CiAgICB9CiAgICBuZXh0ID0gdG1wOwogICAgZm9yICggaW50IGkgPSAwOyBpIDwga1NlY29uZDsgaSsrICkgewogICAgICAgIHRtcCA9IHRyaWVbbmV4dF0ubmV4dFtzZWNvbmRSb3dbIGkgXV07CiAgICAgICAgaWYodG1wID09IDApIHsKICAgICAgICAgICAgdG1wID0gYWxsb2MoKTsKICAgICAgICAgICAgdHJpZVtuZXh0XS5uZXh0W3NlY29uZFJvd1sgaSBdXSA9IHRtcDsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRtcDsKICAgIH0KICAgIHRtcCA9IHRyaWVbbmV4dF0ubmV4dFs1XTsKICAgIGlmKHRtcCA9PSAwKSB7CiAgICAgICAgdG1wID0gYWxsb2MoKTsKICAgICAgICB0cmllW25leHRdLm5leHRbNV0gPSB0bXA7CiAgICB9CiAgICBuZXh0ID0gdG1wOwogICAgZm9yICggaW50IGkgPSAwOyBpIDwga1RoaXJkOyBpKysgKSB7CiAgICAgICAgdG1wID0gdHJpZVtuZXh0XS5uZXh0W3RoaXJkUm93WyBpIF1dOwogICAgICAgIGlmKHRtcCA9PSAwKSB7CiAgICAgICAgICAgIHRtcCA9IGFsbG9jKCk7CiAgICAgICAgICAgIHRyaWVbbmV4dF0ubmV4dFt0aGlyZFJvd1sgaSBdXSA9IHRtcDsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHRtcDsKICAgIH0KICAgICsrKHRyaWVbbmV4dF0uZGF0YSk7ICAKfQogCnZvaWQgbG9va3VwX2ZyZWUoKQp7CiAgICBmcmVlKHRyaWUpOwp9CiAKaW50IG1haW4odm9pZCkKewogICAgLyoKICAgICAgICBJcG90aXp6YW5kbyBkaSBhdmVyZSB1bmEgdGFiZWxsYSBkYSAzIHJpZ2hlIGUgNSBjb2xvbm5lOgogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8ICAgIHwgICAgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAKICAgICAgICBlIGRpIHJpZW1waXJsYSBjYXN1YWxtZW50ZSAocG9wb2xhbmRvbGEgZGEgc2luaXN0cmEgYSBkZXN0cmEgY29uIHVuCiAgICAgICAgaW5kaWNlIGNoZSBjb3JyaXNwb25kZSBhZCB1bmEgbGV0dGVyYSBkZWxsYSBhcnJheSAiYWIiKQogCiAgICAgICAgc3RhdGljIGNoYXIqIGFiW10gPSB7CiAgICAgICAgICAgICJheiIsICJiZCIsICJjZSIsICJkZiIsICJlZiIsICJmZCIsICJnbCIKICAgICovCiAgICBpbnQgXzFyb3dbNV07CiAgICBpbnQgXzJyb3dbNV07CiAgICBpbnQgXzNyb3dbNV07CiAKICAgIGxvb2t1cF9pbml0KCk7CiAKICAgIC8qCiAgICAgICAgUHJpbWEgY29tYmluYXppb25lOgogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCBheiB8IGJkIHwgY2UgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgICAgfCAgICB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGRmIHwgZWYgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAqLwogICAgXzFyb3dbMF0gPSAwOwogICAgXzFyb3dbMV0gPSAxOwogICAgXzFyb3dbMl0gPSAyOwogICAgXzNyb3dbMF0gPSAzOwogICAgXzNyb3dbMV0gPSA0OwogICAgZm9yICggaW50IGMgPSAwOyBjIDwgNTsgYysrICkgewogICAgICAgIC8qIFZlcmlmaWNvIGNoZSBsYSBjb21iaW5hemlvbmUgZXNpc3RhIGdpw6AsIHNlIG5vbiBlc2lzdGUgbGEgY3JlbwogICAgICAgICAgIGFsdHJpbWVudGkgYWdnaW9ybm8gaWwgY2FtcG8gImRhdGEiLgogICAgICAgICAgIEluIHF1ZXN0byBsYSBwcmltYSBjb21iaW5hemlvbmUgYXZyw6AgaWwgY2FtcG8gImRhdGEiIGNvbiBpbCB2YWxvcmUKICAgICAgICAgICA0ICh2aXN0byBjaGUgaW5jcmVtZW50ZXLDoCBhZCBvZ25pICJsb29rdXBfdXBkYXRlIikgKi8KICAgICAgICBsb29rdXBfdXBkYXRlKCAzLCAwLCAyLCBfMXJvdywgXzJyb3csIF8zcm93ICk7CiAgICB9CiAKICAgIC8qCiAgICAgICAgU2Vjb25kYSBjb21iaW5hemlvbmU6CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGF6IHwgYmQgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCBjZSB8ICAgIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgZGYgfCBlZiB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKIAogICAgICAgIENhbXBvICJkYXRhIiBjb24gdmFsb3JlIDEuCiAgICAqLwogICAgXzFyb3dbMF0gPSAwOwogICAgXzFyb3dbMV0gPSAxOwogICAgXzJyb3dbMF0gPSAyOwogICAgXzNyb3dbMF0gPSAzOwogICAgXzNyb3dbMV0gPSA0OwogICAgZm9yICggaW50IGMgPSAwOyBjIDwgMjsgYysrICkgewogICAgICAgIGxvb2t1cF91cGRhdGUoIDIsIDEsIDIsIF8xcm93LCBfMnJvdywgXzNyb3cgKTsKICAgIH0KIAogICAgLyoKICAgICAgICBUZXJ6YSBjb21iaW5hemlvbmU6CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKICAgICAgICB8IGF6IHwgICAgfCAgICB8ICAgIHwgICAgfAogICAgICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCiAgICAgICAgfCBiZCB8IGNlIHwgICAgfCAgICB8ICAgIHwKICAgICAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwogICAgICAgIHwgZGYgfCBlZiB8ICAgIHwgICAgfCAgICB8CiAgICAgICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKIAogICAgICAgIENhbXBvICJkYXRhIiBjb24gdmFsb3JlIDIuCiAgICAqLwogICAgXzFyb3dbMF0gPSAwOwogICAgXzJyb3dbMF0gPSAxOwogICAgXzJyb3dbMV0gPSAyOwogICAgXzNyb3dbMF0gPSAzOwogICAgXzNyb3dbMV0gPSA0OwogICAgZm9yICggaW50IGMgPSAwOyBjIDwgMzsgYysrKSB7CiAgICAgICAgbG9va3VwX3VwZGF0ZSggMSwgMiwgMiwgXzFyb3csIF8ycm93LCBfM3JvdyApOwogICAgfQogCiAgICAvKgogICAgICAgIFF1ZXN0YSDDqCBzZW1wcmUgbGEgc2Vjb25kYSBjb21iaW5hemlvbmUsIHBlcmNpw7IgaW5jcmVtZW50YSBpbCBjYW1wbwogICAgICAgICJkYXRhIiBkaSAxNSB2YWxvcmkuCiAgICAqLwogICAgXzFyb3dbMF0gPSAwOwogICAgXzFyb3dbMV0gPSAxOwogICAgXzJyb3dbMF0gPSAyOwogICAgXzNyb3dbMF0gPSAzOwogICAgXzNyb3dbMV0gPSA0OwogICAgZm9yICggaW50IGMgPSAwOyBjIDwgMTU7IGMrKyApIHsKICAgICAgICBsb29rdXBfdXBkYXRlKCAyLCAxLCAyLCBfMXJvdywgXzJyb3csIF8zcm93ICk7CiAgICB9CiAgICAKICAgIHByaW50ZigiJWQiLCB0cmllW25leHRdLmRhdGEpOwoKICAgIGxvb2t1cF9mcmVlKCk7Cn0=