Submission #1235844

#TimeUsernameProblemLanguageResultExecution timeMemory
1235844khomeCombo (IOI18_combo)C++17
100 / 100
9 ms768 KiB
#include "combo.h"
#include<bits/stdc++.h>
using namespace std;

set<char> st;
vector<char> chs;

string tik(vector<string> v){
  string ans = ""; 
  for (string s : v) ans += s;
  return ans;
}

string guess_sequence(int N) {
  string p = "";
  string bas;

  if (N == 1) {
    int a = press("A"), b = press("B"), x = press("X");
    if (a == 1) return "A";
    if (b == 1) return "B";
    if (x == 1) return "X";
    else return "Y";
  }

  int ab = press("AB"), bx = press("BX");
  
  if (ab == 2) {
    bas = "AB";
  }

  else if (bx == 2) {
    bas = "BX";
  }
  
  else if (ab == 1) {
    if (bx == 1) {
      int ba = press("BA");
      if (ba == 2) bas = "BA";
      else bas = "BY";
    }
    if (bx == 0) {
      int ax = press("AX");
      if (ax == 2) bas = "AX";
      else bas = "AY";
    }
  }
  
  else if (ab == 0) {
    if (bx == 1) {
      if (N == 2) {
        int xa = press("XA"), xb = press("XB");
        if (xa == 2) bas = "XA";
        else if (xb == 2) bas = "XB";
        else bas = "XY";
        return bas;
      }
      int xa = press("XAAXABXAYXB");
      if (xa == 3) bas = "XA";
      else if (xa == 2) bas = "XB";
      else bas = "XY";
    }
    if (bx == 0) {
      if (N == 2){
        int ya = press("YA"), yb = press("YB");
        if (ya == 2) bas = "YA";
        else if (yb == 2) bas = "YB";
        else bas = "YX";
        return bas;
      }
      int yb = press("YAAYABYAXYB");
      if (yb == 3) bas = "YA";
      else if (yb == 2) bas = "YB";
      else bas = "YX";
    }
  } // max 4 guesses to gues the first two;
  
  if (N == 2) return bas;

  st = {'A', 'B', 'Y', 'X'};
  st.erase(bas[0]);
  for (char c : st) chs.push_back(c);

  while (bas.size() != N - 1) {
    string a = bas, b = bas, c = bas, d = bas;
    a += chs[0]; b += chs[0]; c += chs[0];
    a += chs[0]; b += chs[1]; c += chs[2];
    d += chs[1];
    string cur = tik({a, b, c, d});
    int ans = press(cur);
    if (ans == bas.size() + 2) bas += chs[0];
    else if (ans == bas.size() + 1) bas += chs[1];
    else if (ans == bas.size()) bas += chs[2];

    // cout << "currently " << bas << endl;
  }

  string a = bas, b = bas, c = bas;
  a += chs[0];
  b += chs[1];
  c += chs[2];
  int as = press(a);
  if (as == N) return a;
  int bs = press(b);
  if (bs == N) return b;
  return c;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...