하노이의 큐

시간 제한3초메모리 제한2048 MB

요약
큐 A의 정수를 두 개의 빈 큐를 이용해 오름차순으로 정렬하고, L번 이하의 이동 순서를 출력한다.
난이도

보통10점 중 7점

유형
큐, 시뮬레이션, 분할 정복, 재귀
정답자
아직 제출이 없습니다

문제

하노이의 탑은 1883년 프랑스의 수학자 에두아르드 뤼카가 처음으로 발표한 게임으로, 3개의 기둥과 여러 개의 원반을 가지고 하는 게임입니다. 이 문제는 하노이의 탑과 비슷하게 3개의 큐(Queue)와 NN개의 정수가 주어집니다.

세 개의 큐 AA, BB, CC가 있습니다. 처음에 큐 AA에는 앞에서부터 NN개의 정수 a_1,a_2,…,a_Na\_1, a\_2, \dots, a\_N가 들어 있으며, 나머지 두 개의 큐는 비어 있습니다. 여러분은 아래 작업을 00번 이상 반복할 수 있습니다.

  • 서로 다른 두 큐 XX와 YY를 선택합니다. XX는 비어 있지 않아야 합니다.
  • 큐 XX의 맨 앞에 있는 원소를 큐 YY의 맨 뒤로 옮깁니다.

큐 AA의 원소 a_1,a_2,…,a_Na\_1, a\_2, \dots, a\_N가 주어질 때, 여러분은 최대 LL번 작업을 반복한 후에 아래 조건이 성립하도록 하는 방법을 찾아야 합니다.

  • 세 개의 큐 중 두 개는 비어 있으며, 나머지 하나의 큐 XX에는 NN개의 정수가 들어 있어야 합니다.
  • XX의 원소를 앞에서부터 순서대로 나열했을 때, 값이 더 작은 원소는 반드시 값이 더 큰 원소보다 앞에 옵니다.

문제의 조건에 따라 그러한 방법이 언제나 존재함을 증명할 수 있습니다.

입력

각 입력은 여러 개의 테스트 케이스로 구성됩니다. 첫 번째 줄에 테스트 케이스의 개수 TT가 주어집니다.

그다음 줄부터 총 TT개의 테스트 케이스가 2T2T개의 줄에 걸쳐 주어집니다.

각 테스트 케이스는 아래와 같이 두 줄로 구성됩니다.

  • 첫 번째 줄에 큐 AA의 원소의 개수 NN과 작업의 최대 횟수 LL이 공백으로 구분되어 주어집니다.
  • 두 번째 줄에 큐 AA의 원소 a_1,a_2,…,a_Na\_1, a\_2, \dots, a\_N이 공백으로 구분되어 주어집니다.

출력

각 테스트 케이스마다 아래와 같이 최대 두 개의 줄을 출력합니다.

  • 첫 번째 줄에 사용한 연산의 횟수 kk를 출력합니다. (0≤k≤L)(0 \le k \le L)
  • 두 번째 줄에 각 작업에 대응되는 문자열 kk개를 공백으로 구분하여 출력합니다. 각 문자열은 작업에서 선택한 서로 다른 두 큐 XX와 YY의 이름을 공백 없이 붙인 것과 같습니다. 예를 들어 큐 XX를 AA로, 큐 YY를 BB로 선택했다면 출력할 문자열은 'AB'입니다.

단, k=0k = 0이라면 두 번째 줄을 출력하지 않아도 됩니다.

kk는 반드시 LL 이하여야 하지만 kk를 최소화할 필요는 없습니다.

제한

  • 1≤T≤1,0001 \le T \le 1\\, 000
  • 2≤N≤32,7682 \le N \le 32\\, 768
  • NN은 22의 거듭제곱입니다.
  • 모든 테스트 케이스에서 NN의 합은 50,00050\\, 000 이하입니다.
  • L≤N2L \le N^2
  • 1≤a_i≤N1 \le a\_i \le N

예제1

  1. 예제 1

    입력
    4
    2 4
    2 1
    4 16
    1 3 2 4
    4 16
    1 2 3 4
    8 64
    1 2 2 5 4 3 8 7
    
    예상 출력
    2
    AB BA
    5
    AB AC AB CB AB
    0
    15
    AB AB AB AC AB CB BC BC BC AC BC BC AB AC BC