#include "Anna.h"
#include <vector>
using namespace std;
int enc(char c){
if(c=='X') return 0;
if(c=='Y') return 1;
return 2; // Z
}
void Anna(int N, vector<char> S) {
for(int i=0;i<N;i++){
int v = enc(S[i]);
Send(v & 1);
Send((v >> 1) & 1);
}
}
#include "Bruno.h"
#include <vector>
#include <algorithm>
using namespace std;
static int dec(int b0, int b1){ return b0 | (b1<<1); }
void Bruno(int N, int L, vector<int> A) {
vector<char> S(N);
for(int i=0;i<N;i++){
int v = dec(A[2*i], A[2*i+1]);
if(v==0) S[i]='X';
else if(v==1) S[i]='Y';
else S[i]='Z';
}
int FULL = (1<<N) - 1;
const int NEG = -1e9;
vector<int> dp(1<<N, NEG);
vector<int> par_mask(1<<N, -1);
vector<int> par_i(1<<N, -1);
auto is_good = [&](int mask, int i)->int{
if(S[i] != 'Y') return 0;
int x = -1;
for(int j=i-1;j>=0;j--){
if(((mask>>j)&1)==0){ x=j; break; }
}
int z = -1;
for(int j=i+1;j<N;j++){
if(((mask>>j)&1)==0){ z=j; break; }
}
if(x==-1 || z==-1) return 0;
return (S[x]=='X' && S[z]=='Z') ? 1 : 0;
};
dp[0]=0;
for(int mask=0; mask<=FULL; mask++){
if(dp[mask]==NEG) continue;
for(int i=0;i<N;i++){
if((mask>>i)&1) continue;
int nmask = mask | (1<<i);
int gain = is_good(mask, i);
if(dp[nmask] < dp[mask] + gain){
dp[nmask] = dp[mask] + gain;
par_mask[nmask] = mask;
par_i[nmask] = i;
}
}
}
vector<int> order;
int cur = FULL;
while(cur){
int i = par_i[cur];
order.push_back(i);
cur = par_mask[cur];
}
reverse(order.begin(), order.end());
for(int i: order) Remove(i);
}