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

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

一는 零, 零는 一

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

요약
집합 S에서 문자열을 골라 이어 붙인 뒤 인접한 문자를 바꿔 이진 문자열 t를 만듭니다. 교환 횟수가 가장 적고 사전순으로 앞선 결과를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 문자열, 그리디
정답자
아직 제출이 없습니다

문제

당신은 '이진의 연금술사'라는 이름을 얻은 유명한 연금술사다. 그 별명이 뜻하는 대로, 요청에 따라 '0'과 '1'로 이루어진 이진 문자열을 마음대로 만들어 내는 것이 당신의 특기다. 다만 연금술의 기본은 등가 교환이라서, 무에서 유를 만들 수는 없다. 그래서 당신은 다음 절차에 따라 이진 문자열을 만든다.

  1. 재료가 될 이진 문자열 몇 개를 문자열 집합 SS에 미리 저장해 둔다.
  2. 빈 문자열에서 시작한다. SS에서 임의의 문자열을 하나 골라 끝에 이어 붙이는 과정을 임의의 횟수만큼 반복한다. 같은 문자열을 여러 번 골라도 된다.
  3. 이어 붙인 문자열에서 인접한 두 문자를 서로 바꾸는 과정을 임의의 횟수만큼 반복한다.

당신은 이진 문자열 tt와 이진 문자열 집합 SS가 주어졌을 때, SS를 재료로 삼아 위 절차에 따라 tt를 만들고자 한다. tt를 만드는 절차가 여러 가지라면, 3번 단계의 교환 횟수가 적을수록 좋다. 교환 횟수도 같은 절차가 여럿이라면, 2번 단계가 끝난 시점의 문자열 중 사전순으로 가장 작은 것을 고르는 편이 낫다. 연성진을 더 간결하게 만들 수 있기 때문이다.

당신은 가능한 한 즉시 술법을 펼칠 수 있도록, 2번 단계가 끝난 시점에서 최적의 문자열을 자동으로 구하는 보조 프로그램을 만들기로 했다. 어떤 절차를 쓰더라도 가진 SS로 tt를 만들 수 없는 경우도 있다. 그럴 때는 "IMPOSSIBLE"을 출력한다.

입력

입력은 여러 개의 데이터셋으로 이루어진다.

각 데이터셋은 정수 nn이 적힌 한 줄로 시작한다. 이는 문자열 집합 SS에 들어 있는 문자열이 nn개임을 뜻하며, 1≤n≤1001 \le n \le 100을 만족한다. 이어지는 nn개의 줄 중 ii번째 줄은 SS에 속한 ii번째 이진 문자열 SiS_i를 나타낸다. SiS_i는 '0'과 '1'만으로 이루어지며, 길이 ∣Si∣|S_i|는 1≤∣Si∣≤1001 \le |S_i| \le 100을 만족한다. 모든 1≤i<j≤n1 \le i < j \le n에 대해 Si≠SjS_i \ne S_j가 보장된다. 그다음 줄에는 만들고자 하는 문자열 tt가 주어진다. tt는 '0'과 '1'만으로 이루어지며, 길이 ∣t∣|t|는 1≤∣t∣≤1001 \le |t| \le 100을 만족한다.

입력의 끝은 0 한 줄로 표시된다. 전체 데이터셋의 수는 100을 넘지 않는다.

출력

tt를 만드는 절차에서 2번 단계가 끝난 시점에 만들 수 있는 문자열을 한 줄에 출력한다. 그런 문자열이 여럿이면, 3번 단계에서 인접한 두 문자를 교환한 횟수가 가장 적은 것을 출력한다. 그래도 여럿이면 사전순으로 가장 작은 것을 출력한다. 그런 문자열이 하나도 없으면 "IMPOSSIBLE"을 출력한다.

예제1

  1. 예제 1

    입력
    2
    00
    1
    010
    3
    110
    011
    0
    010010
    3
    110
    010
    11
    0110010
    0
    
    예상 출력
    001
    000110
    IMPOSSIBLE