이진 수열 복원

문제 정보

    • 문제 ID
    • 시간 제한
    • 메모리 제한
    • 제출 횟수
    • 정답 횟수 (비율)
    • 출제자
    • 출처
    • 분류

문제

\texttt{0}\texttt{1}로 구성된 길이 N의 이진 수열이 있다. 이러한 이진 수열은 \texttt{0} 또는 \texttt{1}이 연속적으로 나타난 것을 이어붙인 모양을 하게 되는데, 이처럼 한 문자가 연속적으로 나타나는 것을 체인이라고 한다. 예를 들어 이진 수열 \texttt{1001110000}이 주어지면, 이것은 차례로 길이가 1\texttt{1}의 체인, 길이가 2\texttt{0}의 체인, 길이가 3\texttt{1}의 체인, 그리고 길이가 4\texttt{0}의 체인을 이어붙인 모양을 하고 있다. 이진 수열에 포함된 \texttt{1}의 체인의 길이를 차례로 나열한 것을 이 수열의 힌트 수열이라고 한다. 예를 들어 이진 수열 \texttt{1001110000}의 힌트 수열은 \langle {1,\;3} \rangle이고, 이진 수열 \texttt{01110001111101001}의 힌트 수열은 \langle {3,\;5,\;1,\;1} \rangle이다.

당신은 힌트 수열이 주어졌을 때 이를 바탕으로 원래의 이진 수열을 복원하려고 한다. 예를 들어 힌트 수열이 \langle {1,\;2,\;3} \rangle이고, N=8이라면, 이를 바탕으로 원래의 이진 수열 \texttt{10110111}을 복원해 낼 수 있다. 수열을 완전히 복원하진 못하더라도 일부분을 복원할 수 있는 경우도 있다. 예를 들어 힌트 수열이 \langle {3} \rangle이고 N=5라면, 가능한 경우는 \texttt{11100}, \texttt{01110}, \texttt{00111}의 세 가지 경우밖에 없다. 이 때에는 어떤 경우라도 가운데 위치에 \texttt{1}이 오기 때문에, 이를 \texttt{??1??}로 복원할 수 있다. 여기서 \texttt{?}는 해당 위치를 복원할 수 없었음을 나타낸다.

그러나 경우에 따라서는 수열을 추가적으로 복원하지 못할 수도 있다. 예를 들어 힌트 수열이 \langle {3,\;2} \rangle이고 N=11이라고 하자. 그러면 이를 이진 수열로 복원하는 방법은 \texttt{11100000011}, \texttt{00011101100}, \texttt{11100011000} 등 여러 가지가 있다. 이처럼 수열의 각 위치에 \texttt{0}이 올 수도 있고 \texttt{1}이 올 수도 있기 때문에, 수열의 어느 위치도 하나로 확정할 수가 없다. 하지만 이진 수열의 일부를 미리 알고 있다면 복원에 도움이 되기도 한다. 예를 들어, 힌트 수열이 \langle {3,\;2} \rangle이고, N=11이며, 수열의 일부가 \texttt{??1?0?0???0}와 같다고 하자. 여기서 \texttt{?}는 해당 위치를 알 수 없었음을 나타낸다. 이에 맞춰서 복원하는 경우를 모두 따져보면 \texttt{11100001100}, \texttt{11100000110}, \texttt{01110001100}, \texttt{01110000110} 의 네 가지 경우가 가능하다. 가능한 모든 경우에 대해 한 위치가 동일하게 복원되는 것들을 모두 모아보면, 이 경우에는 이진 수열을 \texttt{?11?000?1?0}로 복원할 수 있음을 알 수 있다.

N, 힌트 수열, 그리고 이진 수열의 일부가 주어졌을 때, 수열을 복원하는 프로그램을 작성하여라. 주어진 정보로부터 복원 가능한 모든 경우를 따져 보았을 때, 어떤 특정 위치에 한 문자(\texttt{0} 또는 \texttt{1})가 모든 경우에 대해 공통적으로 나타난다면, 해당 위치를 해당 문자로 복원할 수 있는 것이다. 만일 주어진 이진 수열에 비해 추가적으로 복원하는 것이 불가능하다면 주어진 이진 수열을 그대로 출력하면 된다. 또한 원래 주어진 정보에 모순이 있다면 복원 가능한 경우가 하나도 존재하지 않을 수 있는데, 이러한 경우에는 \texttt{IMPOSSIBLE} 을 출력한다. 예를 들어, 힌트 수열이 \langle {3,\;3} \rangle이고 주어진 이진 수열이 \texttt{??010??}이었다면, 여기에 모순되지 않게 수열을 복원할 수는 없다.

입력

입력의 첫째 줄에는 테스트 케이스의 개수 T가 주어진다. 다음 줄부터 T개의 테스트 케이스가 주어지며, 각 테스트 케이스는 한 줄로 이루어진다. 먼저 자연수 N(1 \leq N \leq 50)이 주어진다. 다음으로는 힌트 수열의 길이를 나타내는 정수 M(0 \leq M \leq 50)이 주어지고, 이어서 힌트 수열을 나타내는 M개의 1 이상의 자연수가 주어진다. 마지막으로는 이진 수열을 나타내는 N개의 문자로 구성된 문자열이 주어진다. 문자열은 \texttt{0}, \texttt{1}, \texttt{?}로만 구성된다.

출력

출력은 T개의 줄에 각 테스트 케이스에 대한 답을 출력한다. 만일 해당 케이스에 모순이 있었다면 \texttt{IMPOSSIBLE}가 답이 되고, 그렇지 않은 경우라면 해당 케이스에 대해서 이진 수열을 복원한 것이 답이 된다.

예제 입력

7
10 2 1 3 1??111????
17 4 3 5 1 1 0???000?????0?00?
8 3 1 2 3 10110111
5 1 3 ?????
11 2 3 2 ???????????
11 2 3 2 ??1?0?0???0
7 2 3 3 ??010??

예제 출력

1001110000
01110001111101001
10110111
??1??
???????????
?11?000?1?0
IMPOSSIBLE

노트

0개의 댓글이 있습니다.