#include <iostream>
#include <memory>
#include <vector>
#include <ctime>
#include <algorithm>
static const uint64_t SEED = 0xDEADBEEFull;
static const uint32_t COLORS_NUM = 2;
static uint64_t next = SEED;
uint32_t LCGRand()
{
next = next * 6364136223846793005 + 1442695040888963407;
return next >> 32;
}
void resetLCGRand()
{
next = SEED;
}
float getEmaxAvg(size_t sequenceLen, size_t sequencesCount = 30)
{
size_t sum = 0;
for (size_t tries = 0; tries < sequencesCount; tries++) {
uint32_t lastColor = LCGRand();
size_t currentSequence = 1;
size_t maxSequence = 0;
for (size_t i = 1; i < sequenceLen; i++) {
uint32_t color = LCGRand() % COLORS_NUM;
if (color != lastColor) {
maxSequence = std::max(maxSequence, currentSequence);
currentSequence = 1;
} else {
++currentSequence;
}
lastColor = color;
}
sum += maxSequence;
}
return (float)sum / sequencesCount;
}
int main()
{
resetLCGRand();
for (auto && seqLen : { 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000 }) {
std::cout << seqLen << "," << getEmaxAvg(seqLen, 30) << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CgpzdGF0aWMgY29uc3QgdWludDY0X3QgU0VFRCA9IDB4REVBREJFRUZ1bGw7CnN0YXRpYyBjb25zdCB1aW50MzJfdCBDT0xPUlNfTlVNID0gMjsKc3RhdGljIHVpbnQ2NF90IG5leHQgPSBTRUVEOwp1aW50MzJfdCBMQ0dSYW5kKCkKewogICAgbmV4dCA9IG5leHQgKiA2MzY0MTM2MjIzODQ2NzkzMDA1ICsgMTQ0MjY5NTA0MDg4ODk2MzQwNzsKICAgIHJldHVybiBuZXh0ID4+IDMyOwp9Cgp2b2lkIHJlc2V0TENHUmFuZCgpCnsKICAgIG5leHQgPSBTRUVEOwp9CgpmbG9hdCBnZXRFbWF4QXZnKHNpemVfdCBzZXF1ZW5jZUxlbiwgc2l6ZV90IHNlcXVlbmNlc0NvdW50ID0gMzApCnsKICAgIHNpemVfdCBzdW0gPSAwOwogICAgZm9yIChzaXplX3QgdHJpZXMgPSAwOyB0cmllcyA8IHNlcXVlbmNlc0NvdW50OyB0cmllcysrKSB7CiAgICAgICAgdWludDMyX3QgbGFzdENvbG9yID0gTENHUmFuZCgpOwogICAgICAgIHNpemVfdCBjdXJyZW50U2VxdWVuY2UgPSAxOwogICAgICAgIHNpemVfdCBtYXhTZXF1ZW5jZSA9IDA7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZXF1ZW5jZUxlbjsgaSsrKSB7CiAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yID0gTENHUmFuZCgpICUgQ09MT1JTX05VTTsKICAgICAgICAgICAgaWYgKGNvbG9yICE9IGxhc3RDb2xvcikgewogICAgICAgICAgICAgICAgbWF4U2VxdWVuY2UgPSBzdGQ6Om1heChtYXhTZXF1ZW5jZSwgY3VycmVudFNlcXVlbmNlKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRTZXF1ZW5jZSA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICArK2N1cnJlbnRTZXF1ZW5jZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0Q29sb3IgPSBjb2xvcjsKICAgICAgICB9CiAgICAgICAgc3VtICs9IG1heFNlcXVlbmNlOwogICAgfQogICAgcmV0dXJuIChmbG9hdClzdW0gLyBzZXF1ZW5jZXNDb3VudDsKfQoKaW50IG1haW4oKQp7CiAgICByZXNldExDR1JhbmQoKTsKCiAgICBmb3IgKGF1dG8gJiYgc2VxTGVuIDogeyAxMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAxMDAwMDAwLCAxMDAwMDAwMCwgMTAwMDAwMDAwIH0pIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc2VxTGVuIDw8ICIsIiA8PCBnZXRFbWF4QXZnKHNlcUxlbiwgMzApIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==