블록 합치기 게임
시간 제한10초메모리 제한256 MB
도착하는 2의 거듭제곱 블록을 좌우 끝에 붙이고 이웃한 같은 길이를 반복해 합쳐 하나의 블록으로 만들 수 있는지 판단하고 가장 작은 방향 문자열을 출력합니다.
문제
길이가 모두 2의 거듭제곱인 1차원 블록 개가 주어진 순서대로 하나씩 나온다. 블록이 나오면 지금까지 쌓아 놓은 블록 줄의 맨 왼쪽이나 맨 오른쪽에 붙여야 한다. 첫 블록은 어느 쪽에 붙여도 같은 줄이 된다.
이웃한 두 블록의 길이가 같아지면 두 블록은 길이가 두 배인 블록 하나로 합쳐진다. 합쳐진 블록이 다시 이웃과 길이가 같으면 길이가 같은 이웃이 없어질 때까지 합쳐진다. 합칠 수 있는 이웃 쌍은 어느 순간에도 최대 하나뿐이라서, 합쳐지는 결과는 고른 방향만으로 정해진다.
예를 들어 현재 줄이 2, 4, 16일 때 길이 2인 블록을 왼쪽에 붙이면 2, 2, 4, 16이 4, 4, 16을 거쳐 8, 16이 된다. 같은 블록을 오른쪽에 붙이면 2, 4, 16, 2가 되고 합쳐지는 쌍은 없다.
블록 개를 모두 붙인 뒤 블록이 하나만 남으면 이긴다. 주어진 순서로 이길 수 있는지 판정하고, 이길 수 있으면 붙이는 방향을 출력하라.
입력
첫 줄에 테스트 케이스의 수 ()가 주어진다.
각 테스트 케이스는 두 줄이다. 첫 줄에 블록의 개수 ()이 주어진다. 둘째 줄에 블록 개의 길이가 나오는 순서대로 공백으로 구분되어 주어진다. 각 길이는 2의 거듭제곱이고, 한 테스트 케이스의 길이 합은 이하다.
출력
각 테스트 케이스마다 한 줄을 출력한다.
블록 하나만 남길 수 없으면 no를 출력한다.
남길 수 있으면 길이가 인 문자열을 출력한다. 번째 문자는 번째 블록을 왼쪽에 붙이면 l, 오른쪽에 붙이면 r이다. 이기는 문자열이 여러 개면 사전순으로 가장 앞서는 하나만 출력한다. l이 r보다 앞서고 첫 블록은 어느 쪽에 붙여도 같으므로, 이 문자열의 첫 문자는 항상 l이다.