Submission #1016880

#TimeUsernameProblemLanguageResultExecution timeMemory
1016880ProtonDecay314Combo (IOI18_combo)C++17
100 / 100
26 ms1832 KiB
/* AM+DG */

/*
AB
A or X, depending on the last query's result

2 queries to get letter 1

Then N - 2 queries for everything except the last letter

Then 2 queries for the last letter

AZXAZYBAZYXAZYY
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pi;
typedef pair<ll, ll> pll;
typedef vector<pi> vpi;
typedef vector<pll> vpll;
typedef vector<vpi> vvpi;
typedef vector<vpll> vvpll;
typedef vector<bool> vb;
#define IOS ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define L(varll, mn, mx) for(ll varll = (mn); varll < (mx); varll++)
#define LR(varll, mx, mn) for(ll varll = (mx); varll > (mn); varll--)
#define LI(vari, mn, mx) for(int vari = (mn); vari < (mx); vari++)
#define LIR(vari, mx, mn) for(int vari = (mx); vari > (mn); vari--)
#define INPV(varvec) for(auto& varveci : (varvec)) cin >> varveci
#define fi first
#define se second
#define pb push_back
#define INF(type) numeric_limits<type>::max()
#define NINF(type) numeric_limits<type>::min()
#define TCASES int t; cin >> t; while(t--)
#include "combo.h"

// #define DEBUG

string guess_sequence(int N) {
    string ans;
    
    char first;

    if(press("AB") > 0) {
        if(press("A") > 0) first = 'A';
        else first = 'B';
    } else {
        if(press("X") > 0) first = 'X';
        else first = 'Y';
    }

    ans.pb(first);

    if(N == 1) return ans;

    string poss = "ABXY";

    string nf;

    LI(i, 0, 4) {
        if(poss[i] == first) continue;
        nf.pb(poss[i]);
    }

    LI(i, 0, N - 2) {
        stringstream guess;
        guess << ans;
        guess << nf[1];
        guess << ans;
        guess << nf[2] << nf[0];
        guess << ans;
        guess << nf[2] << nf[1];
        guess << ans;
        guess << nf[2] << nf[2];

        int guess_ans = press(guess.str());

        ans.pb(nf[guess_ans - ((int)ans.size())]);
    }

    // Last letter

    if(press(ans + "A" + ans + "B") == N) {
        if(press(ans + "A") == N) ans.pb('A');
        else ans.pb('B');
    } else {
        if(press(ans + "X") == N) ans.pb('X');
        else ans.pb('Y');
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...