#include <iostream>
#include <memory>
#include <vector>
static const uint64_t SEED = 0xDEADBEEFull;
static const size_t ROWS = 100;
static const size_t COLS = 100;
static const uint32_t COLORS_NUM = 3;
uint32_t LCGRand()
{
static uint64_t seed = SEED;
seed = seed * 6364136223846793005 + 1442695040888963407;
return seed >> 32;
}
struct Block {
uint32_t color;
size_t size;
};
using BlockPtr = std::shared_ptr<Block>;
struct Proxy {
BlockPtr block;
};
using ProxyPtr = std::shared_ptr<Proxy>;
int main()
{
std::vector<ProxyPtr> up_row(COLS);
size_t max_size = 0;
for (size_t row = 0; row < ROWS; row++) {
ProxyPtr left;
for (size_t col = 0; col < COLS; col++) {
uint32_t color = LCGRand() % COLORS_NUM;
ProxyPtr &up = up_row[col];
ProxyPtr cur;
if (left && (left->block->color == color)) {
cur = left;
if (up && (up->block->color == color) && (up->block != left->block)) {
left->block->size += up->block->size;
up->block = left->block;
}
} else if (up && (up->block->color == color)) {
cur = up;
} else {
BlockPtr block = std::make_shared<Block>(Block{color, 0});
cur = std::make_shared<Proxy>(Proxy{block});
}
++cur->block->size;
if (cur->block->size > max_size)
max_size = cur->block->size;
left = up = cur;
}
}
std::cout << "Max block size: " << max_size << std::endl;
return 0;
}