#include <bits/stdc++.h>
using namespace std;
void add_element(std::string x);
bool check_element(std::string x);
void compile_set();
string s;
void Write(int l,int r)
{
if(l==r)return;
int m=(l+r)/2;
for(int i=l;i<=m;i++)
{
s[i]='1';
add_element(s);
s[i]='0';
}
for(int i=m+1;i<=r;i++)s[i]='1';
Write(l,m);
for(int i=m+1;i<=r;i++)s[i]='0';
for(int i=l;i<=m;i++)s[i]='1';
Write(m+1,r);
for(int i=l;i<=m;i++)s[i]='0';
}
vector<int> p;
void Read(int l,int r,vector<int> ind)
{
if(l==r)
{
p[ind[0]]=l;
return;
}
// bits [l,r] in original string correspond to bits ind in the shuffled one
int m=(l+r)/2;
vector<int> lt,rt;
for(int i:ind)
{
s[i]='1';
if(check_element(s))
{
lt.push_back(i);
}
else
{
rt.push_back(i);
}
s[i]='0';
}
for(auto i:rt)s[i]='1';
Read(l,m,lt);
for(auto i:rt)s[i]='0';
for(auto i:lt)s[i]='1';
Read(m+1,r,rt);
for(auto i:lt)s[i]='0';
}
std::vector<int> restore_permutation(int n, int w, int r)
{
s.clear();
p.clear();
vector<int> q;
for(int i=0;i<n;i++)s+='0',q.push_back(i),p.push_back(0);
Write(0,n-1);
for(int i=0;i<n;i++)s[i]='0';
compile_set();
Read(0,n-1,q);
return p;
}
Compilation message (stderr)
messy.h:1:9: warning: #pragma once in main file
1 | #pragma once
| ^~~~
messy_c.h:1:9: warning: #pragma once in main file
1 | #pragma once
| ^~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |