uppgb.c (840B)
1 #include "common.h" 2 3 int main(int argc, char **argv) { 4 char **lines; 5 size_t nlines = readlines(&lines, "input"); 6 size_t i, j; 7 uint64_t card; 8 uint64_t sum = 0; 9 uint64_t copies[nlines]; 10 smallset ls[nlines], rs[nlines], in[nlines]; 11 12 parse_sets(ls, rs, lines, nlines); 13 14 for (i = 0; i < nlines; i++) { 15 copies[i] = 1; 16 } 17 18 for (i = 0; i < nlines; i++) { 19 smallset_init(&in[i], 128); 20 smallset_intersection(&in[i], &ls[i], &rs[i]); 21 22 card = smallset_cardinality(&in[i]); 23 for (j = i + 1; j <= i + card; j++) { 24 if (j >= nlines) 25 break; 26 copies[j] += copies[i]; 27 } 28 } 29 30 for (i = 0; i < nlines; i++) { 31 sum += copies[i]; 32 } 33 34 printf("%llu\n", sum); 35 36 for (i = 0; i < nlines; i++) { 37 smallset_clear(&in[i]); 38 smallset_clear(&ls[i]); 39 smallset_clear(&rs[i]); 40 } 41 42 return 0; 43 }