#include "encoder.h"
#include "encoderlib.h"
#include <set>
#include <bitset>
using namespace std;
using pii = pair<int,int>;
#define s second
#define f first
void encode(int N, int M[])
{
bitset<512> bs;
int cnt = 0;
for(int i{};i < N;i++){
for(int j{};j < 8;j++){
bs[i*8+j] = (M[i]>>j)&1;
cnt += bs[i*8+j];
}
}
int save = 0;
if(cnt > N*4){
send(0);
send(0);
send(0);
send(0);
save = 1;
}
for(int i{};i < N*8;i++){
if(bs[i] ^ save){
if(i >= 256){
send(i-256);
send(i-256);
}
else send(i);
}
}
}
//2 bit position 1-4 -> 6 bit position
#include "decoder.h"
#include "decoderlib.h"
#include <bitset>
#include <iostream>
#include <map>
void decode(int N, int L, int X[])
{
std::bitset<512> ans;
std::map<int,int> mp;
for(int i{};i < L;i++){
if(!mp.count(X[i])) mp[X[i]] = 0;
mp[X[i]]++;
}
int val = 1;
if(!mp.count(0)) mp[0] = 0;
int cnt = mp[0];
if(cnt >= 4){
val = 0;
ans.set();
cnt = 4;
}
else cnt = 0;
mp[0] -= cnt;
for(auto [a,b]:mp){
if(b == 1 || b == 3){
ans[a] = val;
}
if(b == 2 || b == 3){
ans[a+256] = val;
}
}
//cout << ans << endl;
int cur = 0;
for(int i{};i <= N*8;i++){
if(i%8 == 0 && i != 0) output(cur),cur = 0;
cur += ans[i]<<(i%8);
//cout << cur << " -"<< endl;
}
}