Cod sursa(job #1690316)

Utilizator razvandRazvan Dumitru razvand Data 14 aprilie 2016 23:19:34
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#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;
}