Submission #884468

#TimeUsernameProblemLanguageResultExecution timeMemory
884468gustavo_dCombo (IOI18_combo)C++17
100 / 100
14 ms1792 KiB
// https://oj.uz/problem/view/IOI18_combo > p152
#include "combo.h"
#include <bits/stdc++.h>
using namespace std;

/*
botões A,B,X,Y no jogo, você pode fazer combos apertando + de um juntos
tem uma sequência secreta S de N chars
primeiro char dela nunca repete, bruta A, B, C, D (AABB, CCDD > o que for, você tenta um e se n é o outro; custo 3) > sobra 3 possibilidades pro resto; sendo A, ABAC se n for é o AD, se não tenta tipo AB se nao for é o AC (custo 2n-2)
você deve digitar até 4N chars, sua pontuação é o tamanho do maior prefixo de S que é substring da sequência sua
após o mínimo de combos 4N, você deve descobrir S

custo total: 2n-2+2 = 2n

pode chamar press com 0 a 4N chars até 8000 vezes e N até 2000

q<=N+2

O(n)
primeira: 4 chamadas, testa primeiro char
2N: só sobra 3 possibilidades pra cada char (primeiro não repete), aí vocẽ testa primeiro com segundo se for, testa 1 se não for é o outro; se não é os 2, é o 3o
*/

string guess_sequence(int N) {
  string S = "";
  string p = "AB";
  int coins = press(p);
  if (coins == 0) { // ou X out Y
	  p = "X";
	  coins = press(p);
	  if (coins == 0) S = "Y";
	  else S = "X";
  } else {
	  p = "A";
	  coins = press(p);
	  if (coins == 0) S = "B";
	  else S = "A";
  }
  vector<char> others;
  if ('A' != S[0]) others.push_back('A');
  if ('B' != S[0]) others.push_back('B');
  if ('X' != S[0]) others.push_back('X');
  if ('Y' != S[0]) others.push_back('Y');
  for (int i = 0; i < N-1; i++) {
	  p = "" + S;
	  p += others[0];
	  p += S;
	  p += others[1];
	  if (i < N-2) {
		  p += others[0];
		  p += S; p += others[1]; p += others[1];
		  p += S; p += others[1]; p += others[2];
		  coins = press(p);
		  if (coins == (int)S.size() + 1) S += others[0];
		  else if (coins == (int)S.size() + 2) S += others[1];
		  else S += others[2];
	  } else {
		  coins = press(p);
		  if (coins == (int)S.size()) S += others[2]; // sem query extra descobre
		  else { // precisa já na primeira descobrir se é o primeiro ou o segundo char (se der no segundo char coloca a combinação dos 3 chars depois além dele) >> 4N dá sempre
			  p = "" + S;
			  p += others[0];
			  coins = press(p);
			  if (coins == (int)S.size()) S += others[1];
			  else S += others[0];
		  }
	  }
  }
  return S;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...