#include "Azzurro.h"
std::vector<std::vector<int>> Azzurro(int n, int l, std::string s) {
while ((int)s.size() < n * n - 2 * n + 3) {
s += 'A';
}
std::vector<std::vector<int>> x(n, std::vector<int>(n, 0));
x[0][0] = (s[0] == 'B');
x[n - 1][n - 1] = (s.back() == 'B');
int alc = 1;
for (int sum = 1; sum < 2 * n - 2; sum ++) {
bool primu = false;
for (int i = 0; i < n; i ++) {
int j = sum - i;
if (j < 0 || j >= n) {
continue;
}
if (!primu) {
primu = true;
int xr = 0;
for (int k = i + 2; k < n; k += 2) {
int l = sum - k;
if (l < 0 || l >= n) {
break;
}
xr ^= (s[alc + k - i - 1] == 'B');
}
x[i][j] = xr;
} else {
x[i][j] = (s[alc ++] == 'B');
}
}
}
return x;
}
#include "Bordeaux.h"
std::string Bordeaux(int n, int l, std::vector<std::vector<int>> x) {
std::vector<int> ans;
ans.push_back(x[0][0] ^ 1);
int lprec = 0;
for (int sum = 1; sum < 2 * n - 2; sum ++) {
bool primu = false;
for (int i = 0; i < n; i ++) {
int j = sum - i;
if (j < 0 || j >= n) {
continue;
}
if (!primu) {
primu = true;
int xr = 0;
for (int k = i; k < n; k += 2) {
int l = sum - k;
if (l < 0 || l >= n) {
break;
}
xr ^= x[k][l];
}
if (!((lprec ^ xr ^ i) & 1)) {
lprec ++;
}
x[lprec][sum - lprec] ^= 1;
} else {
ans.push_back(x[i][j]);
}
}
}
ans.push_back(x[n - 1][n - 1] ^ 1);
std::string s;
for (auto i : ans) {
if (i) {
s += 'B';
} else {
s += 'A';
}
}
while ((int)s.size() > l) {
s.pop_back();
}
return s;
}