Pagini recente » Cod sursa (job #1452164) | Cod sursa (job #2190713) | Cod sursa (job #2695467) | Cod sursa (job #978975) | Cod sursa (job #1690316)
#include <iostream>
#include <fstream>
#include <bitset>
#include <queue>
#include <stack>
#include <vector>
#define left ((nod<<1)&mx)
#define right ((nod<<1)&mx)+1
#define MAX 21
#define BUF 10000
#include <climits>
using namespace std;
ifstream in("biti.in");
ofstream out("biti.out");
bitset<1<<MAX> ok;
int amT[1<<MAX];
unsigned long long mx;
bool en;
unsigned long long n;
stack<unsigned long long> st;
char buf[BUF];
int b;
void wrt(char c) {
if(b == BUF) {
out << buf;
b = 0;
}
buf[b++] = c;
}
int pref(int nod, int vr) {
nod >>= 1;
if(amT[nod] == vr)
return nod;
nod = nod|(1<<(n-1));
if(amT[nod] == vr)
return nod;
return -1;
}
bool dfs(unsigned long long nod, int am) {
stack<pair<int, int>> fin;
stack<int> trail;
fin.push(make_pair(nod, am));
trail.push(nod);
while(!fin.empty()) {
nod = fin.top().first;
am = fin.top().second;
fin.pop();
ok[nod] = 1;
if(am == 1) {
int T = nod;
while(T != -1) {
st.push(T);
T = pref(T, ++am);
}
st.push(0);
break;
}
if(ok[left] && ok[right]) {
int T = nod;
ok[nod] = 0;
while(trail.top() != fin.top().first) {
ok[trail.top()] = 0;
trail.pop();
}
trail.pop();
continue;
}
bool f = false;
if(right != nod && !ok[right]) {
fin.push(make_pair(right, am-1));
trail.push(right);
amT[right] = min(amT[left], am-1);
f = true;
}
if(left != nod && !ok[left]) {
fin.push(make_pair(left, am-1));
trail.push(left);
amT[left] = min(amT[left], am-1);
f = true;
}
if(!f)
ok[nod] = 0;
}
return true;
}
int main() {
in >> n;
for(unsigned long long i = 0; i < n; i++) {
mx <<= 1;
mx |= 1;
}
for(int i = 0; i <= (1<<n); i++)
amT[i] = INT_MAX;
dfs(0, mx+1);
int top = st.top();
out << n-1+st.size() << '\n';
for(int i = 1; i <= n; i++) {
out << (top&1);
top >>= 1;
}
st.pop();
while(!st.empty()) {
wrt((st.top()&1)+'0');
st.pop();
}
for(int i = b; i < BUF; i++)
buf[i] = '\0';
out << buf;
return 0;
}