JAG-channel II

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

요약
위로 이동하는 목록 규칙 아래 기록된 스레드 선택 순서와 모순되지 않는 사전 순 최소 게시 순서를 찾습니다.
난이도

보통10점 중 7점

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

문제

JAG는 알고리즘 대회 문화를 넓히는 데 힘쓰는 회원 NN명의 모임이다. 회원들은 JAG-channel이라는 게시판에서 매일 이야기를 나눈다. 게시판에는 스레드가 여러 개 있고, 목록은 마지막 글이 올라온 시각이 늦은 순서로 항상 정렬되어 있다. 그래서 누군가 어떤 스레드에 글을 남기면 그 스레드는 곧바로 목록 맨 위로 올라간다.

어느 날 밤 회원 NN명이 각각 스레드를 하나씩 만들었다. 회원은 앞에서부터 대문자 NN개로 구분하고, 스레드는 그 스레드를 만든 회원의 글자로 나타낸다. 다음 날 아침 각 회원은 전날 밤에 만들어진 스레드 중 서로 다른 KK개에 한 번씩 글을 남겼다. 회원들은 속도를 중요하게 여겨서 목록을 맨 위에서 아래로 훑어보다가 마음에 드는 스레드를 만나면 그 자리에서 바로 글을 남겼다. 회원마다 글을 남긴 시간대가 달라서, 한 회원이 KK개의 글을 남기는 동안 다른 회원의 글은 하나도 올라오지 않았다.

각 회원이 어떤 스레드에 몇 번째로 글을 남겼는지는 알지만, 밤에 만들어진 스레드가 처음에 어떤 순서로 놓여 있었는지는 모른다. 목록 순서가 글이 올라올 때마다 바뀌므로, 회원 순서 중에는 먼저 글을 남긴 회원 때문에 기록된 위에서 아래로의 순서를 만들 수 없어 불가능한 것도 있다. 회원들이 글을 남긴 순서로 가능한 것 중 사전순으로 가장 앞서는 것을 구하여라.

입력

첫 줄에 정수 NN과 KK가 공백 하나로 구분되어 주어진다 (4≤N≤164 \le N \le 16, N−3≤K≤N−1N-3 \le K \le N-1).

다음 NN개의 줄에는 서로 다른 대문자 KK개로 이루어진 문자열이 한 줄에 하나씩 주어진다. ii번째 줄의 jj번째 문자는 ii번째 회원이 jj번째로 글을 남긴 스레드를 뜻한다. 스레드는 그 스레드를 만든 회원의 글자로 나타내므로, 예를 들어 'B'는 두 번째 회원 B가 만든 스레드다.

가능한 회원 순서가 적어도 하나 있음이 보장된다.

출력

가능한 회원 순서 중 사전순으로 가장 앞서는 것을 대문자 NN개로 이루어진 문자열 한 줄로 출력한다. ii번째 문자는 ii번째 시간대에 글을 남긴 회원을 뜻한다.

예제3

  1. 예제 1

    입력
    7 4
    DEFG
    FEDA
    EFGB
    BGEA
    AGFD
    DABC
    CADE
    
    예상 출력
    ABCDEFG
    
  2. 예제 2

    입력
    4 3
    CDB
    DAC
    BAD
    ABC
    
    예상 출력
    DCBA
    
  3. 예제 3

    입력
    16 13
    NDHPFJIBLMCGK
    CMDJKPOLGIHNE
    MOLBIEJFPHADN
    KPNAOHBLMCGEI
    FCMLBHDOANJPK
    NHIGLOAPKJDMC
    KMLBIPHDEOANJ
    IEGCMLBOAPKJD
    JNAOEDHBLMCGF
    OEDHPFIBLMGKC
    GMLBIFPHDNAEO
    ENHGOPKJDMCAF
    JKPAOBLGEIHNF
    HPKFGJEIBLCOM
    LBINEJDAGFKPH
    FGMOCADJENIBL
    
    예상 출력
    PONCAKJGIEDHMFBL