접미사 배열 복원

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

요약
일부가 손상된 접미사 정보들이 주어질 때, 각 위치의 문자가 하나로 결정되는지 확인하고 원래 문자열을 복원한다.
난이도

보통10점 중 6점

유형
문자열, 구현, 시뮬레이션, 배열
정답자
아직 제출이 없습니다

문제

새 직장에서의 긴 하루였다. 당신은 하루 종일, 새 고용주가 다루는 가장 중요한 접미사 배열(suffix array) 자료구조를 최적화했다. 워크스테이션을 막 끄려던 순간, 테스트 실행 결과 중요한 데이터의 상당 부분이 손상되었음이 드러났다. 게다가 백업 서버는 어제 고장 났다.

데이터를 살펴보니 상황은 매우 나빴다. 많은 접미사가 사라졌고, 남아 있는 것들도 손상되었을 수 있다. 어떤 접미사에서는 일부 글자가 임의의 글자로 바뀌었고, 어떤 접미사에서는 연속한 문자 덩어리가 하나의 자리표시 문자 *로 대체되었으며, 서로 모순되는 접미사들도 있다. 이제 남은 희망은 원래의 기반 문자열을 복원하는 것뿐이다.

데이터는 각 접미사와 그 시작 위치의 목록으로 주어지며, 복원해야 할 각 문자열의 길이도 함께 주어진다. 가능하다면 각 기반 문자열을 복원하여라.

복원 규칙. 각 접미사는 위치 pp에서 시작하여, 문자열의 위치 pp부터 마지막 위치 ll까지의 문자들을 나타낸다. 접미사 안에서 문자 *는 사라진, 연속하며 비어 있지 않은 문자 덩어리를 대신하는 자리표시자이다. * 앞에 적힌 문자들은 접미사의 시작에서부터 세어 위치 p,p+1,…p, p+1, \dots에 대응하고, * 뒤에 적힌 문자들은 문자열의 끝 ll에서부터 거꾸로 세어 그 위치들에 대응한다. *가 없는 접미사는 위치 pp부터 ll까지의 모든 문자를 나열한다. 각 접미사에는 *가 최대 하나 있다.

문자열의 각 위치에 대해, 모든 접미사가 그 위치에 대해 주장하는 문자들을 모은다. 모든 위치가 적어도 하나의 문자로 주장되고 각 위치에 대한 모든 주장이 일치할 때에만, 즉 그 위치에서 가능한 문자의 집합이 정확히 하나의 문자만을 포함할 때에만 복원이 가능하다.

입력

첫째 줄에는 테스트 케이스의 수 tt (0<t≤1000 < t \le 100)가 주어진다. 각 테스트 케이스는 다음과 같이 구성된다. 첫째 줄에는 두 정수 ll과 ss (1≤l≤100001 \le l \le 10000; 1≤s≤100001 \le s \le 10000)가 주어지며, 각각 복원할 문자열의 길이와 (일부 손상된) 접미사의 개수이다. 이어지는 ss개의 줄에는 각각 접미사의 시작 위치 pp (1≤p≤l1 \le p \le l)와 접미사 문자열이 주어진다. 각 접미사는 a–z, A–Z, ., * 문자로만 이루어지며(.은 특별한 의미가 없다), *를 최대 하나 포함한다. 모든 접미사에 주어진 문자 수의 총합은 250000250000을 넘지 않는다.

출력

각 테스트 케이스마다, 문자열을 복원할 수 있으면 그 문자열을 한 줄에 출력하고, 그렇지 않으면 IMPOSSIBLE을 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    2
    6 6
    6 a
    5 aa
    4 a*a
    3 aaaa
    2 aaaaa
    1 aaaaaa
    6 6
    6 b
    5 aa
    4 a*a
    3 aaaa
    2 aaaaa
    1 aaaaaa
    
    예상 출력
    aaaaaa
    IMPOSSIBLE