Submission #477059

#TimeUsernameProblemLanguageResultExecution timeMemory
477059Genius3435Combo (IOI18_combo)C++17
0 / 100
1 ms200 KiB
#include "combo.h"

#include <algorithm>
#include <chrono>
#include <random>
#include <string>
#include <ctime>

using namespace std::string_literals;

const int t = std::chrono::high_resolution_clock::now().time_since_epoch().count();

inline int gen(int i) {
	static std::mt19937 rng = std::mt19937(t%10000/10);
	return rng() % i;
}

std::string guess_sequence(int N) {
	std::string cur;
	for (const char c: "ABXY") {
		if (press(cur = c)) break;
	}

	std::string poss = "ABXY"; poss.erase(poss.find(cur[0]), 1);
	const char A = poss[0], B = poss[1], X = poss[2];
	printf("A=%c;B=%c;X=%c\n",A,B,X);


	while ((int) cur.size()+2 <= N) {
		// Let s = cur, A,B,X = poss
		// Try sAA + sAB + sBA
		int p = press(cur+A+A + cur+A+B + cur+B+A);
		const int sz = cur.size();
		if (p == sz) {
			// Next char is X
			cur += X;
		}
		else if (p == sz+1) {
			// Next chars are AX,BB,BX
			p = press(cur+B+B);
			if (p == sz+2) cur += B, cur += B;
			else if (p == sz+1) cur += B, cur += X;
			else cur += A, cur += X;
		}
		else {
			// Next chars are AA,AB,BA
			p = press(cur+A+A);
			if (p == sz+2) cur += A, cur += A;
			else if (p == sz+1) cur += A, cur += B;
			else cur += B, cur += A;
		}
	}

	if (N == (int) cur.size()) return cur;

	if (press(cur+A) == N) return cur+A;
	else if (press(cur+B) == N) return cur+B;
	else return cur+X;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...