#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <limits.h>
#include <time.h>
#include <iostream>
#include <bitset>
#include <vector>
using namespace std;
unsigned int myrand(){
return (rand()<<16) + rand();
}
int main ()
{
const int n = 1000000;
bitset<n> bcp;
printf("bcp %d\n", (int)sizeof(bcp));
unsigned long ebits,
sz = (n + sizeof(unsigned long) * CHAR_BIT - 1) / (ebits = (sizeof(unsigned long) * CHAR_BIT)),
bc[sz], bysz = sizeof(bc);
printf("bc sz = %d ebits = %d bysz = %d\n",
(int)(sz), (int)ebits, (int)bysz);
clock_t s, e;
int nn = 0;
s = clock();
srand(9);
for (int r = 0; r < 50; r++) {
bcp.reset();
for (int i = 0; i < n; i++)
bcp.set(myrand() % n);
for (int i = 0; i < n; i++)
if (bcp.test(i))
nn++;
}
e = clock();
cout << "nn = " << nn << " t = " << e - s << '\n';
nn = 0;
s = clock();
srand(9);
for (int r = 0; r < 50; r++) {
memset(bc, 0, bysz);
for (int i = 0; i < n; i++) {
int bi = myrand() % n;
bc[bi / ebits] |= (1UL << (bi % ebits));
}
for (int i = 0; i < n; i++) {
if (bc[i / ebits] & (1UL << (i % ebits)))
nn++;
}
}
e = clock();
cout << "nn = " << nn << " t = " << e - s << '\n';
vector<bool> vv;
vv.resize(n);
s = clock();
srand(9);
nn = 0;
for (int r = 0; r < 50; r++) {
vv.clear();
for (int i = 0; i < n; i++) {
int bi = myrand() % n;
vv[bi] = 1;
}
for (int i = 0; i < n; i++) {
if (vv[i])
nn++;
}
}
e = clock();
cout << "nn = " << nn << " t = " << e - s << '\n';
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGJpdHNldD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1bnNpZ25lZCBpbnQgbXlyYW5kKCl7CiAgIHJldHVybiAocmFuZCgpPDwxNikgKyByYW5kKCk7Cn0KCmludCBtYWluICgpCnsKICBjb25zdCBpbnQgbiA9IDEwMDAwMDA7CiAgYml0c2V0PG4+IGJjcDsKICBwcmludGYoImJjcCAlZFxuIiwgKGludClzaXplb2YoYmNwKSk7CgogIHVuc2lnbmVkIGxvbmcgZWJpdHMsCiAgICBzeiA9IChuICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQgLSAxKSAvIChlYml0cyA9IChzaXplb2YodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVCkpLAogICAgYmNbc3pdLCBieXN6ID0gc2l6ZW9mKGJjKTsKICBwcmludGYoImJjICBzeiA9ICVkIGViaXRzID0gJWQgYnlzeiA9ICVkXG4iLAogICAgICAgICAoaW50KShzeiksIChpbnQpZWJpdHMsIChpbnQpYnlzeik7CgogIGNsb2NrX3QgcywgZTsKICBpbnQgbm4gPSAwOwoKICBzID0gY2xvY2soKTsKICBzcmFuZCg5KTsKICBmb3IgKGludCByID0gMDsgciA8IDUwOyByKyspIHsKICAgIGJjcC5yZXNldCgpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgIGJjcC5zZXQobXlyYW5kKCkgJSBuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICBpZiAoYmNwLnRlc3QoaSkpCiAgICAgICAgbm4rKzsKICB9CiAgZSA9IGNsb2NrKCk7CiAgY291dCA8PCAibm4gPSAiIDw8IG5uIDw8ICIgdCA9ICIgPDwgZSAtIHMgPDwgJ1xuJzsKCiAgbm4gPSAwOwogIHMgPSBjbG9jaygpOwogIHNyYW5kKDkpOwogIGZvciAoaW50IHIgPSAwOyByIDwgNTA7IHIrKykgewogICAgbWVtc2V0KGJjLCAwLCBieXN6KTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBpbnQgYmkgPSBteXJhbmQoKSAlIG47CiAgICAgIGJjW2JpIC8gZWJpdHNdIHw9ICgxVUwgPDwgKGJpICUgZWJpdHMpKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGlmIChiY1tpIC8gZWJpdHNdICYgKDFVTCA8PCAoaSAlIGViaXRzKSkpCiAgICAgICAgbm4rKzsKICAgIH0KICB9CiAgZSA9IGNsb2NrKCk7CiAgY291dCA8PCAibm4gPSAiIDw8IG5uIDw8ICIgdCA9ICIgPDwgZSAtIHMgPDwgJ1xuJzsKICAKICAKICB2ZWN0b3I8Ym9vbD4gdnY7CiAgdnYucmVzaXplKG4pOwogIHMgPSBjbG9jaygpOwogIHNyYW5kKDkpOwogIG5uID0gMDsKICBmb3IgKGludCByID0gMDsgciA8IDUwOyByKyspIHsKICAgIHZ2LmNsZWFyKCk7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgaW50IGJpID0gbXlyYW5kKCkgJSBuOwogICAgICB2dltiaV0gPSAxOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgaWYgKHZ2W2ldKQogICAgICAgIG5uKys7CiAgICB9CiAgfQogIGUgPSBjbG9jaygpOwogIGNvdXQgPDwgIm5uID0gIiA8PCBubiA8PCAiIHQgPSAiIDw8IGUgLSBzIDw8ICdcbic7Cn0K