Submission #1327729

#TimeUsernameProblemLanguageResultExecution timeMemory
1327729joacruCombo (IOI18_combo)C++20
100 / 100
8 ms516 KiB
#include "combo.h"
#include <iostream>
#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define SZ(v) (int)v.size()

using namespace std;

const string V = "ABXY";

std::string guess_sequence(int N) {
	if(N == 1){
		if(press("AAA")) return "A";
		if(press("BBB")) return "B";
		if(press("XXX")) return "X";
		return "Y";
	}
	if(N == 2){
		int x = press("ABBBBX");
		if(x == 0){
			if(press("YYYYYA") == 2) return "YA";
			if(press("YYYYYB") == 2) return "YB";
			return "YX";
		} else if(x == 1){
			if(press("XXXXXX") == 0){
				if(press("XXAXAY") == 0){
					if(press("BBBBBA") == 2) return "BA";
					return "BY";
				} else{
					if(press("AAAAAX") == 2) return "AX";
					return "AY";
				}
			} else{
				if(press("XXXXXA") == 2) return "XA";
				if(press("XXXXXB") == 2) return "XB";
				return "XY";
			}
		} else if(x == 2){
			if(press("AAAAAB") == 2) return "AB";
			return "BX";
		}
	}
	// caso general
	char first = '-';
	if(press("AB")){
		if(press("A")) first = 'A';
		else first = 'B';
	} else{
		if(press("X")) first = 'X';
		else first = 'Y';
	}
	string s; s += first;
	string v;
	for(char c: V) if(c != first) v += c;
	//~ DBG(s);
	
	for(int i=1;i<N-1;++i){ // siempre tengo que tener dos espacios
		string t = s + v[0];
		for(int j=0;j<3;++j) t += s + v[1] + v[j];
		int x = press(t) - SZ(s);
		if(x == 0) s += v[2];
		if(x == 1) s += v[0];
		if(x == 2) s += v[1];
		//~ DBG(s);
	}
	
	if(press(s+v[0]) - SZ(s)) s += v[0];
	else if(press(s+v[1]) - SZ(s)) s += v[1];
	else s+=v[2];
	
	//~ DBG(s);
	return s;
}

#ifdef LOCAL
#include "grader.cpp"
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...