I wrote my current solution in cpp that checks random numbers but there surely is a better way:
#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>
#include <random>
#include <ctime>
int count_strength(const std::string &s) {
int n = s.size();
std::unordered_set<std::string> seen;
for (int i = 0; i < n; ++i) {
int max_L = (n - i) / 2;
for (int L = 1; L <= max_L; ++L) {
if (s.substr(i, L) == s.substr(i + L, L)) {
seen.insert(s.substr(i, 2 * L));
}
}
}
return seen.size();
}
const int FIXED_LEN = 100;
std::string random_binary_string(std::mt19937 &rng) {
std::uniform_int_distribution<int> dist(0, 1);
std::string s;
s.reserve(FIXED_LEN);
for (int i = 0; i < FIXED_LEN; ++i) {
s += dist(rng) ? '1' : '0';
}
return s;
}
int main() {
std::mt19937 rng(static_cast<unsigned>(std::time(nullptr)));
std::string best_s, worst_s;
int best_score = -1;
int worst_score = INT32_MAX;
while (1)
{
std::string s = random_binary_string(rng);
int sc = count_strength(s);
if (sc < worst_score) {
worst_score = sc;
worst_s = s;
std::cout << "worst " << worst_score << " " << worst_s << "\n";
}
if (sc > best_score) {
best_score = sc;
best_s = s;
std::cout << "best " << best_score << " " << best_s << "\n";
}
}
return 0;
}