# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1162367 | i271828 | Unscrambling a Messy Bug (IOI16_messy) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
int ans[128];
vector<int> vals={};
void add_element(string x){
cout<<"A";
for (int i=0;i<4;i++) cout<<x[i];
cout<<'\n';
}
void compile_set(){}
bool check_element(string x){
cout<<"C";
for (int i=0;i<4;i++) cout<<x[i];
cout<<'\n';
bool v;
cin>>v;
return v;
}
void add(int s,int e,int fs,int fe){
if (s==e) return;
bitset<128> x=0;
for (int i=fs;i<=fe;i++) x[i]=1;
int m=(s+e)>>1;
for (int i=s;i<=m;i++){
if (i>s) x[i-1]=0;
x[i]=1;
string xs;
for (int i=0;i<128;i++) xs.push_back(x[i]+'0');
add_element(xs);
}
add(s,m,m+1,e);
add(m+1,e,s,m);
}
void find(int s,int e,bitset<128>& values, bitset<128>& flag){
if (s==e){
for (int i=0;i<128;i++){
if (values[i]) ans[i]=s;
}
return;
}
bitset<128> x;
bitset<128> left=0;
bitset<128> right=0;
for (int i=0;i<128;i++){
if (values[i]){
x=flag;
x[i]=1;
string xs;
for (int i=0;i<128;i++) xs.push_back(x[i]+'0');
if (check_element(xs)){
left[i]=1;
}else{
right[i]=1;
}
}
}
int m=(s+e)>>1;
find(s,m,left,right);
find(m+1,e,right,left);
}
void restore_permutation(int N, int w, int r, int* result){
add(0,N-1,1,0);
compile_set();
bitset<128> values=0;
for (int i=0;i<N;i++) values[i]=1;
bitset<128> flag=0;
find(0,N-1,values,flag);
for (int i=0;i<N;i++) result[i]=ans[i];
}