4 #define bitread(value, bit) (((value) >> (bit)) & 0x01)
6 int incremental_search(unsigned numbers
[], int len
, int bits
, bool inv
)
8 //Copy for the initial search
11 for (curlen
= 0; curlen
<len
; curlen
++)
12 cur
[curlen
] = numbers
[curlen
];
14 for (int bit
= bits
-1; bit
>= 0 || curlen
> 1; bit
--) {
15 //Determine 0 1 distribution
17 for (int i
= 0; i
<curlen
; i
++)
18 dist
+= bitread(cur
[i
], bit
) == 0 ? -1 : 1;
21 dist
= inv
? 1-dist
: dist
;
25 for (int i
= 0; i
<curlen
; i
++)
26 if (bitread(cur
[i
], bit
) == dist
)
27 cur
[newcurlen
++] = cur
[i
];
35 unsigned numbers
[2000] = {0};
36 int c
= 0, y
= 0, maxbits
= 0, bits
= 0;
37 while ((c
= getchar()) != EOF
) {
39 maxbits
= bits
> maxbits
? bits
: maxbits
;
49 int oxygen
= incremental_search(numbers
, y
, maxbits
, false);
50 int co2
= incremental_search(numbers
, y
, maxbits
, true);
52 printf("%d\n", oxygen
*co2
);