Submission #823526

#TimeUsernameProblemLanguageResultExecution timeMemory
823526SoulKnightCombo (IOI18_combo)C++17
30 / 100
32 ms644 KiB
#include "combo.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ln '\n'

const string B = "ABXY";
string use = "";
string ans = "";
int res;

string add(char a, char b){
    string s = "";
    s.append(1, a);
    s.append(1, b);
    return s;
}

void which(int idx){
    int a, b;
    if (idx == 0) {a = 1; b = 2;}
    else if (idx == 1) {a = 0; b = 2;}
    else {a = 0; b = 1;}

    string s = ans + add(use[idx], use[idx]) + ans + add(use[idx], use[a]);
    res = press(s);
    if (res == ans.size() + 1) ans += add(use[idx], use[b]);
    else {
        s = ans + add(use[idx], use[idx]);
        res = press(s);
        if (res == ans.size() + 1) ans += add(use[idx], use[a]);
        else ans += add(use[idx], use[idx]);
    }
}

void guess(){

    string g1 = ans;
    g1.append(2, use[0]);
    g1 += ans;
    g1.append(1, use[0]); g1.append(1, use[1]);
    g1 += ans;
    g1.append(1, use[0]); g1.append(1, use[2]);
    g1 += ans;
    g1.append(1, use[1]); g1.append(1, ans[0]);


    res = press(g1);
    if (res == ans.size()) which(2);
    else if (res == ans.size() + 1) which(1);
    else which(0);
}

string guess_sequence(int n){


    int i = 0;
    if (n & 1){
        // press one
        for (int i = 0; i < 3; i++){
            res = press(B.substr(i, 1));
            if (res == 1) {ans += B[i]; break;}
        }

        if (ans.empty()) ans += B[3];
        i++;
    } else {
        // press two
        res = press("AB");
        if (res == 2) ans = "AB";
        else if (res == 1){
            int t = press("BXBY");
            if (t == 0){
                int t2 = press("AX");
                ans = ((t2 == 2)? "AX" : "AY");
            } else if (t == 1) ans = "BA";
            else {
                int t2 = press("BX");
                ans = ((t2 == 2)? "BX": "BY");
            }
        } else {
            res = press("XY");
            if (res == 2) ans = "XY";
            else if (res == 1){
                int t = press("YAYB");
                if (t == 0){
                    int t2 = press("XA");
                    ans = ((t2 == 2)? "XA" : "XB");
                } else if (t == 1) ans = "YX";
                else {
                    int t2 = press("YA");
                    ans = ((t2 == 2)? "YA": "YB");
                }
            }
        }
        i += 2;
    }


    for (int i = 0; i < 4; i++) if (ans[0] != B[i]) use += B[i];
    for (; i < n; i += 2) guess();

    // cout << ans << ln;
    return ans;


}

Compilation message (stderr)

combo.cpp: In function 'void which(int)':
combo.cpp:28:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     if (res == ans.size() + 1) ans += add(use[idx], use[b]);
      |         ~~~~^~~~~~~~~~~~~~~~~
combo.cpp:32:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |         if (res == ans.size() + 1) ans += add(use[idx], use[a]);
      |             ~~~~^~~~~~~~~~~~~~~~~
combo.cpp: In function 'void guess()':
combo.cpp:50:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     if (res == ans.size()) which(2);
      |         ~~~~^~~~~~~~~~~~~
combo.cpp:51:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     else if (res == ans.size() + 1) which(1);
      |              ~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...