제출 #1338439

#제출 시각아이디문제언어결과실행 시간메모리
1338439po_rag526콤보 (IOI18_combo)C++20
100 / 100
27 ms596 KiB
#include "combo.h"
#include <cassert>
#include <string>
#include <vector>

using namespace std;
/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <iostream>

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

using ll = long long;
using namespace std;

#define ln '\n'
#define INFi 1e9
#define INFll 1e18

#ifdef ONPC
#include <algo.hpp>
#else
#define dbg(...)
#define dbg_out(...)
#endif

string ans;
int N;

char solve() {
    return 0;
}
vector<char> rr;

inline int ask() {
    assert(!ans.empty());
    vector<string> s(4);
    s[0] = ans + rr[0];
    s[1] = ans + rr[1] + rr[0];
    s[2] = ans + rr[1] + rr[1];
    s[3] = ans + rr[1] + rr[2];
    for (int i = 0; i < 4; i++) {
        assert(s[i].size() <= N);
        while (s[i].size() < N) {
            s[i].push_back(ans[0]);
        }
    }
    string S = s[0] + s[1] + s[2] + s[3];
    assert(S.size() == (N * 4));
    return press(S);
}

char cr[] = {'A', 'B', 'X', 'Y'};

inline int pres(const string &s) {
    return press(s);
}


inline int pres2(string l, string r) {
    while (l.size() < N) {
        l.push_back(ans[0]);
    }
    while (r.size() < N) {
        r.push_back(ans[1]);
    }
    l = l + r;
    return press(l);
}

std::string guess_sequence(int _n) {
    N = _n;
    int last = 0, cur = 0;
    last = 1;
    if (pres("AB")) {
        if (pres("B")) {
            ans = "B";
        } else {
            ans = "A";
        }
    } else {
        if (pres("X")) {
            ans = "X";
        } else {
            ans = "Y";
        }
    }
    for (int i = 0; i < 4; i++) {
        const char &c = cr[i];
        if (c == ans[0])
            continue;
        rr.push_back(c);
    }
    assert(!ans.empty());
    bool last_ok = false;
    for (int i = 1; i < N - 1; i++) {
        int cur = ask();
        if (cur == last) {
            ans.push_back(rr[2]);
        } else if (cur == last + 1) {
            ans.push_back(rr[0]);
        } else {
            assert(last + 2 == cur);
            ans.push_back(rr[1]);
        }
        last = ans.size();
    }
    if (N == 1)
        goto answer;
    if (pres2(ans + rr[0], ans + rr[1]) > last) {
        if (pres(ans + rr[0]) > last) {
            ans = ans + rr[0];
        } else {
            ans = ans + rr[1];
        }
    } else {
        ans = ans + rr[2];
    }
answer:
    assert(N == ans.size());
    return ans;
}

// Attack on titan<3

// Just Imaginary
/*
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
??????????????????????????????
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...