cppAcademy
FROM LEARNING TO COMPETING

Expert.
Put your skills to the test.

Bulgarian Informatics Group A · 2007–2026

274 independently explained problems: 54 Municipal, 54 Regional, 109 National Olympiad and 57 Autumn Tournament tasks. Difficulty labels are learning estimates, not official ratings. Some events share Senior/IATI or Group A/B problem sets. Special formats, scoring limitations and source clarifications are explained on affected tasks. Existing shared National-round problems keep their permanent URLs.
GROUP A2014 · Very hardGray-code cycle construction

Shortest AB Word with a Transformation Cycle

Autumn Tournament (2014)

Submission name: abwords.cpp

Problem summary

A word has at least two letters A/B and starts with A. Operation 1 toggles its last letter. Operation 2 keeps the first A and makes each later letter B when the two corresponding adjacent original letters agree, otherwise A. Given N, construct a shortest word and N operations returning to it, with no earlier repeated word.

Input

One integer N.

Output

Print a shortest valid word, then N digits 1/2 specifying the operations. Print NO only if no solution exists. The construction below shows that every allowed N has a solution.

Constraints

2 ≤ N ≤ 100000. The original task awards partial credit for longer valid words; this construction attains the minimum length.

Worked example

Independent optimal output for the official sample input. The source gives another shortest word, AABB.

Input

6

Output

ABBB
222121

Solution analysis

  1. Encode A as 1 and B as 0. A word is therefore an L-bit integer with leading bit 1. Operation 2 becomes G(x)=x XOR (x>>1), the Gray-code transform, and operation 1 becomes T(x)=x XOR 1. These transformations commute, since shifting the last bit right removes it.
  2. For a power of two q, repeated application gives G^q(x)=x XOR (x>>q). Consequently the order of G on an L-bit word is the smallest power of two at least L. When L=q+1, applying G q times toggles only the final bit, so G^q=T. For other lengths between consecutive powers, T leads to a second, disjoint G-cycle.
  3. Handle N=2 with AA and 11, and N=4 with ABB and 2222. Otherwise let m be the largest power of two strictly less than N and k=N−m. Choose L=m+1 for odd N, or L=m/2+2 for even N. Start with A followed by L−1 Bs. Output m−k copies of 2, followed by k copies of 21; there are exactly m+k=N operations.
  4. For N=6, m=4,k=2,L=4. Starting from ABBB, the sequence 222121 gives AABB, ABAB, AAAA, AAAB, ABBA, then ABBB. These six states before the return are distinct. The extra toggles visit the second lane of the Gray cycle rather than repeating an earlier state.
  5. Why shortest? A word shorter than m/2+2 has a transformation component with at most m states. This rules it out for even N>m. For odd N, lengths at most m either have components of at most m states, or have an even cycle with toggling between two lanes, a bipartite graph with no odd cycle. Thus L≥m+1 is necessary. The stated construction meets these bounds; N=2 and N=4 are the small exceptions handled directly.

Why it works

In the even construction, G has order m and T switches between two disjoint lanes. The walk advances around the G-cycle once; its k even toggles return to the original lane. Each extra toggle visits the other lane at a different cycle position, so no intermediate state repeats. In the odd construction G has order 2m and T=G^m. The net m G-steps and k odd toggles cancel. The initial segment visits one half of the cycle, and the alternating tail visits distinct corresponding positions in its two halves; only the final step returns to the start. The component-size and bipartiteness lower bounds prove minimality.

Complexity: O(N) time and O(N) space, including the word and output operations; no explicit simulation of the exponentially large word-state graph is needed.

Watch out. Compute operation 2 from the original adjacent letters, not in place from already updated letters. The power m is strictly below N, including when N is a power of two. Handle N=4 separately. A valid cycle alone does not guarantee full credit: the word length must be minimal.

Commented C++17 solution

An independently written complete program with standard headers.

#include<iostream>
#include<string>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin>>n;
    if(n==2){
        cout<<"AA\n11\n";
        return 0;
    }
    if(n==4){
        cout<<"ABB\n2222\n";
        return 0;
    }
    int power=1;
    while(power*2<n){
        power*=2;
    }
    int extra=n-power;
    int length=n%2==1?power+1:power/2+2;
    string word(length,'B');
    word[0]='A';
    string operations(power-extra,'2');
    for(int i=0;i<extra;i++){
        // Switch lanes after advancing to the next Gray-cycle position.
        operations+="21";
    }
    cout<<word<<'\n'<<operations<<'\n';
}

Source: Arena Olimpiici ↗