#include using namespace std; string solution(int A, int B) { string result; int a = 0, b = 0; while (a < A || b < B) { // no three letters can repeat // A must be less than or equal to 2B + 2 // e.g aabaabaa => A = 6, b = 2 => A <= 2B + 2 if (A < B) { if (a++ < A) result.push_back('a'); if (a++ < A) result.push_back('a'); if (b++ < B) result.push_back('b'); if (2 * b > a) { if (b++ < B) result.push_back('b'); } } else // A < B, B must be less than or equal to 2A + 2 { if (b++ < B) result.push_back('b'); if (b++ < B) result.push_back('b'); if (a++ < A) result.push_back('a'); if (2 * a > b) { if (a++ < A) result.push_back('a'); } } } return result; } int main(void) { vector> testCases = { // A B { 3, 3, "aababb" }, { 4, 3, "aabaabb" }, { 5, 3, "aabaabab" }, // A = 2B - 1 { 6, 3, "aabaabaab"}, // A = 2B { 7, 3, "aabaabaaba"}, // A = 2B + 1 { 8, 3, "aabaabaabaa"}, // A = 2B + 2 { 1, 4, "bbabb" }, // B = 2A + 2 { 14, 6, "aabaabaabaabaabaabaa" }, // A = 2B + 2 { 6, 14, "bbabbabbabbabbabbabb" }, // B = 2A + 2 }; for (auto tc: testCases) { int A = get<0>(tc); int B = get<1>(tc); string expected = get<2>(tc); string result = solution(A,B); int width = 10; cout << setw(width) << "input: A=" << A << " B=" << B << endl; cout << setw(width) << "result: " << result << endl; cout << setw(width) << "expected: " << expected << endl; cout << (result == expected ? "passed" : "failed") << endl; cout << "-----------------\n"; } }