Submission #305047

#TimeUsernameProblemLanguageResultExecution timeMemory
305047mihai145Combo (IOI18_combo)C++14
100 / 100
47 ms652 KiB
#include "combo.h"
#include <vector>
#include <set>
#include <cassert>

std::string guess_sequence(int N)
{
    std::string s1 = "", s2 = "", s3 = "";

    ///first letter logic
    int coins = press("AB");
    if(coins == 0)
    {
        ///first letter is X or Y
        coins = press("X");
        if(coins == 0)
            s1 += 'Y';
        else
            s1 += 'X';
    }
    else
    {
        ///first letter is A or B
        coins = press("A");
        if(coins == 0)
            s1 += 'B';
        else
            s1 += 'A';
    }

    std::set <char> opts;
    opts.insert('A');
    opts.insert('B');
    opts.insert('X');
    opts.insert('Y');
    opts.erase(s1[0]);

    std::vector <char> optv;
    for(auto it : opts)
        optv.push_back(it);

    while(true)
    {
        ///EDGE CASES
        if(s2 == "" && s3 == "")
        {
            if((int)s1.size() == N)
                break;

            ///s1 is for sure a correct preffix
            if((int)s1.size() == N - 1)
            {
                coins = press(s1 + optv[0] +
                                s1 + optv[1]);

                if(coins == (int)s1.size() + 1)
                {
                    coins = press(s1 + optv[0]);

                    if(coins == (int)s1.size() + 1)
                        s1 += optv[0];
                    else
                        s1 += optv[1];
                }
                else
                {
                    s1 += optv[2];
                }

                break;
            }
        }
        else
        {
            ///one of s1, s2 and s3 is a correct preffix
            if((int)s1.size() == N)
            {
                coins = press(s1 + s2);

                if(coins == N)
                {
                    coins = press(s1);
                    if(coins != N)
                        s1 = s2;
                }
                else
                    s1 = s3;

                break;
            }
        }

        ///BULK CASES
        if(s2 == "" && s3 == "")
        {
            ///s1 is for sure a correct preffix
            coins = press(s1 + optv[0] + optv[0] +
                            s1 + optv[0] + optv[1] +
                            s1 + optv[0] + optv[2] +
                            s1 + optv[1]);

            if(coins == (int)s1.size() + 2)
            {
                s2 = s1 + optv[0] + optv[1];
                s3 = s1 + optv[0] + optv[2];
                s1 = s1 + optv[0] + optv[0];
            }
            else if(coins == (int)s1.size() + 1)
                s1 += optv[1];
            else
                s1 += optv[2];
        }
        else
        {
            ///one of s1, s2 and s3 is a correct preffix
            coins = press(s1 + optv[0] +
                            s1 + optv[1] +
                            s1 + optv[2] +
                            s2);

            if(coins == (int)s1.size() + 1)
            {
                s2 = s1 + optv[1];
                s3 = s1 + optv[2];
                s1 = s1 + optv[0];
            }
            else if(coins == (int)s1.size())
            {
                s1 = s2;
                s2 = "";
                s3 = "";
            }
            else
            {
                s1 = s3;
                s2 = "";
                s3 = "";
            }
        }
    }

    return s1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...