아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

블록 합치기 게임

시간 제한10초메모리 제한256 MB

요약
도착하는 2의 거듭제곱 블록을 좌우 끝에 붙이고 이웃한 같은 길이를 반복해 합쳐 하나의 블록으로 만들 수 있는지 판단하고 가장 작은 방향 문자열을 출력합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 비트 연산, 시뮬레이션, 백트래킹
정답자
아직 제출이 없습니다

문제

길이가 모두 2의 거듭제곱인 1차원 블록 nn개가 주어진 순서대로 하나씩 나온다. 블록이 나오면 지금까지 쌓아 놓은 블록 줄의 맨 왼쪽이나 맨 오른쪽에 붙여야 한다. 첫 블록은 어느 쪽에 붙여도 같은 줄이 된다.

이웃한 두 블록의 길이가 같아지면 두 블록은 길이가 두 배인 블록 하나로 합쳐진다. 합쳐진 블록이 다시 이웃과 길이가 같으면 길이가 같은 이웃이 없어질 때까지 합쳐진다. 합칠 수 있는 이웃 쌍은 어느 순간에도 최대 하나뿐이라서, 합쳐지는 결과는 고른 방향만으로 정해진다.

예를 들어 현재 줄이 2, 4, 16일 때 길이 2인 블록을 왼쪽에 붙이면 2, 2, 4, 16이 4, 4, 16을 거쳐 8, 16이 된다. 같은 블록을 오른쪽에 붙이면 2, 4, 16, 2가 되고 합쳐지는 쌍은 없다.

블록 nn개를 모두 붙인 뒤 블록이 하나만 남으면 이긴다. 주어진 순서로 이길 수 있는지 판정하고, 이길 수 있으면 붙이는 방향을 출력하라.

입력

첫 줄에 테스트 케이스의 수 TT (1≤T≤1001 \le T \le 100)가 주어진다.

각 테스트 케이스는 두 줄이다. 첫 줄에 블록의 개수 nn (1≤n≤10001 \le n \le 1000)이 주어진다. 둘째 줄에 블록 nn개의 길이가 나오는 순서대로 공백으로 구분되어 주어진다. 각 길이는 2의 거듭제곱이고, 한 테스트 케이스의 길이 합은 2132^{13} 이하다.

출력

각 테스트 케이스마다 한 줄을 출력한다.

블록 하나만 남길 수 없으면 no를 출력한다.

남길 수 있으면 길이가 nn인 문자열을 출력한다. ii번째 문자는 ii번째 블록을 왼쪽에 붙이면 l, 오른쪽에 붙이면 r이다. 이기는 문자열이 여러 개면 사전순으로 가장 앞서는 하나만 출력한다. l이 r보다 앞서고 첫 블록은 어느 쪽에 붙여도 같으므로, 이 문자열의 첫 문자는 항상 l이다.

예제2

  1. 예제 1

    입력
    3
    9
    2 8 4 1 1 4 4 4 4
    5
    2 16 4 8 2
    3
    2 2 2
    
    예상 출력
    lllrrlrrr
    no
    no
    
  2. 예제 2

    입력
    4
    1
    1
    2
    1 1
    2
    1 2
    6
    1 1 2 4 8 16
    
    예상 출력
    l
    ll
    no
    llllll