#include "combo.h"
#include <bits/stdc++.h>
using namespace std;
int n;
string guess;
char decode(int x) {
if (x == 0) return 'A';
else if (x == 1) return 'B';
else if (x == 2) return 'X';
else if (x == 3) return 'Y';
return '\n';
}
int findNext(string guess) {
int sz = guess.size();
int l = 0, r = 3;
while (l < r) {
int mid = (l + r) / 2;
string combo;
for (int i = 0; i <= mid; i++) {
combo = combo + guess;
combo.push_back(decode(i));
}
if (press(combo) >= sz + 1) {
r = mid;
}
else {
l = mid + 1;
}
}
return l;
}
std::string guess_sequence(int N) {
n = N;
guess.clear();
int start = findNext(guess);
guess.push_back(decode(start));
string left;
for (int i = 0; i < 4; i++) {
if (i != start) left.push_back(decode(i));
}
while (guess.size() < n - 1) {
string combo;
combo = combo + guess;
combo.push_back(left[0]);
combo.push_back(left[0]);
combo = combo + guess;
combo.push_back(left[0]);
combo.push_back(left[1]);
combo = combo + guess;
combo.push_back(left[0]);
combo.push_back(left[2]);
combo = combo + guess;
combo.push_back(left[1]);
int sz = guess.size();
int total = press(combo);
if (total == sz) {
guess.push_back(left[2]);
}
else if (total == sz + 1) {
guess.push_back(left[1]);
}
else if (total == sz + 2) {
guess.push_back(left[0]);
}
}
if (guess.size() < n) {
int last = findNext(guess);
guess.push_back(decode(last));
}
return guess;
}