KHU와 DKU

시간 제한1초메모리 제한1024 MB

요약
길이 2N인 중복집합에서 D, H, K, U의 개수가 주어질 때, 앞 절반 B1의 "KHU" 부분 수열 최댓값과 뒤 절반 B2의 "DKU" 부분 수열 최댓값이 같아지도록 문자를 배치한 문자열 B를 찾는다.
난이도

어려움10점 중 8점

유형
그리디, 수학, 구현, 조합론
정답자
아직 제출이 없습니다

문제

2N2N개의 문자들로 이루어진 중복집합 AA가 있다. AA의 모든 문자는 'D', 'H', 'K', 'U'중 하나이다.

 AA의 모든 문자들을 임의의 순서로 나열하여 만든 문자열을 BB라 하고, BB의 11번째부터 NN번째 문자까지 추출한 부분 문자열을 B_1B\_1, N+1N+1번째부터 2N2N번째 문자까지 추출한 부분 문자열을 B_2B\_2라 하자.

문자열 SS에 대하여 함수 khu\text{khu}와 dku\text{dku}를 다음과 같이 정의한다.

  •  khu(S)\text{khu}(S): SS에서 부분 수열로 등장하는 "KHU"의 개수
  •  dku(S)\text{dku}(S): SS에서 부분 수열로 등장하는 "DKU"의 개수

쿠옹이와 단웅이는 BB의 부분 문자열 B_1B\_1과 B_2B\_2에 대하여 다음과 같은 작업을 진행한다.

쿠옹이는 B_1B\_1의 문자들의 순서를 적절히 바꾸어 새로운 문자열 S_1S\_1을 만든다. 쿠옹이는 khu(S_1)\text{khu}(S\_1)의 값이 최대가 되는 순서를 선택한다.

단웅이는 B_2B\_2의 문자들의 순서를 적절히 바꾸어 새로운 문자열 S_2S\_2를 만든다. 단웅이는 dku(S_2)\text{dku}(S\_2)의 값이 최대가 되는 순서를 선택한다.

쿠옹이와 단웅이의 작업이 끝났을 때 khu(S_1)=dku(S_2)\text{khu}(S\_1) = \text{dku}(S\_2)를 만족시키는 문자열 BB를 아무거나 하나 찾아보자.

입력

첫째 줄에 테스트 케이스의 수 TT가 주어진다. (T≥1T \geq 1)

각 테스트 케이스의 첫째 줄에 NN이 주어진다. (1≤N≤1061 \leq N \leq 10^6)

각 테스트 케이스의 둘째 줄에 음이 아닌 정수 dd, hh, kk, uu가 공백으로 구분되어 주어진다. dd, hh, kk, uu는 각각 AA에 들어있는 문자 'D', 'H', 'K', 'U'의 개수를 의미한다. (d+h+k+u=2Nd+h+k+u = 2N)

모든 테스트 케이스에 대한 NN의 합은 10610^6을 넘지 않는다.

출력

각 테스트 케이스마다 khu(S_1)=dku(S_2)\text{khu}(S\_1) = \text{dku}(S\_2)를 만족시키는 문자열 BB가 존재한다면 첫째 줄에 "YES"를 출력하고, 둘째 줄에 BB를 출력한다. 가능한 답이 여러 가지라면 아무거나 출력한다.

만약 가능한 문자열 BB가 존재하지 않는다면 첫째 줄에 "NO"를 대신 출력한다.

힌트

문자열의 부분 수열이란 주어진 문자열에서 원래 순서를 유지하며 00개 이상의 문자를 제거하여 얻을 수 있는 문자열이다.

예를 들어, 문자열 "KHUDKU"에는 다음과 같이 부분 수열로 "KHU"가 22번, "DKU"가 11번 등장한다.

  • "KHUDKU"
  • "KHUDKU"
  • "KHUDKU"

예제1

  1. 예제 1

    입력
    2
    3
    1 1 2 2
    4
    1 2 2 3
    
    예상 출력
    YES
    KHUDKU
    YES
    KUHHUKUD