#include "Azzurro.h"
#include <bits/stdc++.h>
using namespace std;
std::vector<std::vector<int>> Azzurro(int N, int L, std::string S) {
std::vector<std::vector<int>> x(N, std::vector<int>(N, 0));
int cnt = 0;
while (S.length() < 51) S += 'A';
for (int i = 0; i < N + N - 1; i++) {
if (i == 0 || i == N + N - 2) {
x[i/2][i/2] = (S[cnt] == 'B' ? 1 : 0);
cnt++;
continue;
}
int cnt1 = 0;
for (int j = max(0, i - N + 1); j <= min(N - 1, i); j++) {
if (j < min(N - 1, i)) {
x[j][i - j] = (S[cnt] == 'B' ? 0 : 1);
cnt++;
}
else {
for (int k = j - 2; k >= max(0, i - N + 1); k -= 2) cnt1 ^= x[k][i - k];
x[j][i - j] = cnt1;
}
}
}
return x;
}
#include "Bordeaux.h"
#include <bits/stdc++.h>
using namespace std;
std::string Bordeaux(int N, int L, std::vector<std::vector<int>> T) {
std::string s(L, 'A');
int r = 0, c = 0;
s[0] = (T[0][0] == 0 ? 'B' : 'A');
vector < vector <int> > v(N, vector <int> (N, 0));
int cnt = 1;
for (int i = 1; i < N + N - 1; i++) {
if (cnt == L) return s;
if (i == 0 || i == N + N - 2) {
s[cnt] = (T[i/2][i/2] == 1 ? 'A' : 'B');
cnt++;
continue;
}
int cnt1 = 0;
for (int j = min(N - 1, i); j >= max(0, i - N + 1); j -= 2) {
cnt1 ^= T[j][i - j];
}
if (cnt1) {
int t = min(N - 1, i);
if ((t + r) % 2) {
r++;
v[r][c] = 1;
}
else {
c++;
v[r][c] = 1;
}
}
else {
int t = min(N - 1, i);
if ((t + r) % 2 == 0) {
r++;
v[r][c] = 1;
}
else {
c++;
v[r][c] = 1;
}
}
for (int j = max(0, i - N + 1); j < min(N - 1, i); j++) {
s[cnt] = (T[j][i - j] ^ v[j][i - j] ? 'A' : 'B');
cnt++;
if (cnt == L) return s;
}
}
return s;
}