Submission #1311455

#TimeUsernameProblemLanguageResultExecution timeMemory
1311455dimitri.shengelia콤보 (IOI18_combo)C++20
100 / 100
11 ms524 KiB
#include <bits/stdc++.h>
//#include "combo.h"

using namespace std;

int press ( string p );

string guess_sequence ( int N ) {

	int n = N;

	string answer = "";

	vector <string> v( 4 );
	v = { "A", "B", "X", "Y" };

	if ( n == 1 ) {

		if ( press( "A" ) == 1 ) {

			return "A";

		} else if ( press( "B" ) == 1 ) {

			return "B";

		} else if ( press( "X" ) == 1 ) {

			return "X";

		} else {

			return "Y";

		}

	}

	for ( int i = 0; i < n; i++ ) {

		string s = "";

		if ( i == 0 ) {

			if ( press( "AB" ) > 0 ) {

				if ( press ( "A" ) == 1 ) {

					answer = "A";

					v.erase( v.begin() );

				} else {

					answer = "B";

					v.erase( v.begin() + 1 );

				}

			} else {

				if ( press( "X" ) == 1 ) {

					answer = "X";

					v.erase( v.begin() + 2 );

				} else {

					answer = "Y";

					v.erase( v.begin() + 3 );

				}


			}

			continue;

		}  else if ( i == n - 1 ) {

			for ( int j = 0; j < 2; j++ ) {

				if ( press( answer + v[j] ) == n ) {

					answer += v[j];

					break;

				}

			}

			if ( answer.length() != n ) {

				answer += v[2];

			}

			continue;

		} else {

			for ( int j = 0; j < 2; j++ ) {

				if ( j == 0 ) {

					s = answer + v[j];

				} else {

					for ( int z = 0; z < 3; z++ ) {

						s += answer + v[j] + v[z];

					}

				}

			}

			int k = press( s );

			if ( k == answer.length() ) {

				answer += v[2];

			} else if ( k == answer.length() + 1 ) {

				answer += v[0];

			} else {

				answer += v[1];

			}

		}

	}

	return answer;

}





























/*




#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>

namespace {

constexpr int MAX_N = 2000;
constexpr int MAX_NUM_MOVES = 8000;

int N;
std::string S;

int num_moves;

void wrong_answer(const char *MSG) {
	printf("Wrong Answer: %s\n", MSG);
	exit(0);
}

}  // namespace

int press(std::string p) {
	if (++num_moves > MAX_NUM_MOVES) {
		wrong_answer("too many moves");
	}
	int len = p.length();
	if (len > 4 * N) {
		wrong_answer("invalid press");
	}
	for (int i = 0; i < len; ++i) {
		if (p[i] != 'A' && p[i] != 'B' && p[i] != 'X' && p[i] != 'Y') {
			wrong_answer("invalid press");
		}
	}
	int coins = 0;
	for (int i = 0, j = 0; i < len; ++i) {
		if (j < N && S[j] == p[i]) {
			++j;
		} else if (S[0] == p[i]) {
			j = 1;
		} else {
			j = 0;
		}
		coins = std::max(coins, j);
	}
	return coins;
}

int main() {
	char buffer[MAX_N + 1];
	if (scanf("%s", buffer) != 1) {
		fprintf(stderr, "Error while reading input\n");
		exit(1);
	}
	S = buffer;
	N = S.length();

	num_moves = 0;
	std::string answer = guess_sequence(N);
	if (answer != S) {
		wrong_answer("wrong guess");
		exit(0);
	}
	printf("Accepted: %d\n", num_moves);
	return 0;
}

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...