#include "Azzurro.h"
#include <bits/stdc++.h>
using namespace std;
namespace {
// グローバル変数と内部関数は無名名前空間内で宣言すること
// All global variables and internal functions should be declared in an unnamed namespace
int variable_example = 0;
int function_example(void) { return 0; }
}
vector<vector<int>> Azzurro(int N, int L, string S) {
vector<int> bitcode;
for(int i = 0;i < 51;i++){
if(i < L) {
if(S[i] == 'A') bitcode.push_back(0);
else bitcode.push_back(1);
}else{
bitcode.push_back(0);
}
}
vector<vector<int>> ret(N, vector<int>(N, 0));
int infoid = -1;
auto get_info = [&](){
infoid++;
return bitcode[infoid];
};
int lastId = 0;
for(int row = 0;row <= 14;row++){
vector<pair<int,int>> loc;
for(int i = 0;i < 8;i++){
if(row-i >= 0 && row-i < 8) loc.push_back({i,row-i});
}
if(loc.size() == 1){
ret[loc[0].first][loc[0].second] = get_info();
}else{
int sum = 0;
for(int i = 0;i < loc.size();i++){
auto [x,y] = loc[i];
if(i == loc.size()-1){
ret[x][y] = sum%2;
continue;
}
ret[x][y] = get_info();
if(i%2 == (loc.size()-1)%2) sum += ret[x][y];
}
}
}
// cout << "origin: " << endl;;
// for(int i = 0;i < N;i++){
// for(int j = 0;j < N;j++){
// cout << ret[i][j] << " ";
// }
// cout << endl;
// }
return ret;
}
#include "Bordeaux.h"
#include <bits/stdc++.h>
using namespace std;
namespace {
// グローバル変数と内部関数は無名名前空間内で宣言すること
// All global variables and internal functions should be declared in an unnamed namespace
int variable_example = 0;
int function_example(void) { return 0; }
}
string Bordeaux(int N, int L, vector<vector<int>> T) {
vector<int> bitcode;
// cout << "#" << L << endl;
// for(int i = 0;i < N;i++){
// for(int j = 0;j < N;j++){
// cout << T[i][j] << " ";
// }
// cout << endl;
// }
int lastId = 0;
for(int row = 0;row <= 14;row++){
vector<pair<int,int>> loc;
auto reverse = [&](int i){
// cout << "row: " << row << ", reverse: " << i << endl;
auto [x,y] = loc[i];
T[x][y] = 1-T[x][y];
lastId = i;
};
for(int i = 0;i < 8;i++){
if(row-i >= 0 && row-i < 8) loc.push_back({i,row-i});
}
if(loc.size() == 1){
reverse(0);
bitcode.push_back(T[loc[0].first][loc[0].second]);
}else{
int sum = 0;
for(int i = loc.size()-1;i >= 0;i-=2){
auto [x,y] = loc[i];
sum += T[x][y];
}
{
int poss1,poss2;
if(row <= 7){
poss1 = lastId,poss2 = lastId+1;
}else{
poss1 = lastId-1,poss2 = lastId;
}
if(sum%2 == 1){
if((poss1+2)%2 == (loc.size()-1)%2){
reverse(poss1);
}else{
reverse(poss2);
}
}else{
if((poss1+2)%2 == (loc.size()-1)%2){
reverse(poss2);
}else{
reverse(poss1);
}
}
}
for(int i = 0;i < loc.size()-1;i++){
bitcode.push_back(T[loc[i].first][loc[i].second]);
}
}
}
string ret;
for(int i = 0;i < L;i++){
if(bitcode[i] == 0) ret += 'A';
else ret += 'B';
}
return ret;
}