포럼
문제 COCI00088

Matrica

설명

행렬은 글자들의 직사각형 표이다. 정사각 행렬은 행과 열의 수가 같은 행렬이다. 정사각 행렬 \(M\)의 글자들이 주대각선에 대해 대칭이면(모든 \(i\), \(j\) 쌍에 대해 \(M_{ij} = M_{ji}\)) 그 행렬을 대칭 행렬이라고 한다.

대칭 행렬 두 개:

AAB    AAA
ACC    ABA
BCC    AAA

대칭이 아닌 행렬 두 개:

ABCD   AAB
ABCD   ACA
ABCD   DAA
ABCD

사용할 수 있는 글자들의 모음이 주어졌을 때, 그 글자들을 모두 사용하여 만들 수 있는 사전순으로 가장 앞서는 대칭 행렬에서, 지정된 열들의 부분집합을 출력해야 한다.

그런 행렬이 존재하지 않으면 IMPOSSIBLE을 출력한다.

행렬 \(A\)가 행렬 \(B\)보다 사전순으로 앞서는지 판단하려면, 원소들을 행 우선 순서로(모든 행을 이어 붙여 긴 문자열을 만든 것처럼) 생각한다. 두 행렬이 처음으로 다른 원소가 \(A\)에서 더 작으면 \(A\)\(B\)보다 사전순으로 앞선다.

제약
입력 형식

입력의 첫째 줄에 두 정수 \(N\) (\(1 \le N \le 30000\))과 \(K\) (\(1 \le K \le 26\))가 주어진다. \(N\)은 행렬의 크기이고, \(K\)는 나타나는 서로 다른 글자의 수이다.

다음 \(K\)개의 줄에는 대문자 하나와 양의 정수 하나가 공백으로 구분되어 주어진다. 이 정수는 해당 글자를 몇 개 사용해야 하는지를 나타낸다. 예를 들어 어떤 줄에 "A 3"이라고 되어 있으면 글자 A는 출력 행렬에 세 번 나타나야 한다. 글자의 총수는 정확히 \(N^2\)이다. 같은 글자가 입력에 두 번 이상 나타나지는 않는다.

다음 줄에 출력해야 하는 열의 수인 정수 \(P\) (\(1 \le P \le 50\))가 주어진다.

마지막 줄에 정수 \(P\)개, 즉 출력해야 하는 열들의 번호가 주어진다. 번호는 \(1\) 이상 \(N\) 이하이며, 오름차순으로 중복 없이 주어진다.

출력 형식

주어진 글자 모음으로 대칭 행렬을 만들 수 있으면, 요구된 열들을 \(N\)개의 줄에, 각 줄에 \(P\)개의 문자를 공백 없이 출력한다. 그렇지 않으면 IMPOSSIBLE(따옴표는 표기의 명확성을 위한 것)을 출력한다.

채점: 전체 점수의 \(60\%\)에 해당하는 테스트 케이스에서는 \(N\)이 최대 \(300\)이다. 전체 점수의 \(80\%\)에 해당하는 테스트 케이스에서는 \(N\)이 최대 \(3000\)이다.

서브태스크
서브태스크점수설명

Subtask 1

110점
예제 1
입력
3 3
A 3
B 2
C 4
3
1 2 3
출력
AAB
ACC
BCC
예제 2
입력
4 4
A 4
B 4
C 4
D 4
4
1 2 3 4
출력
AABB
AACC
BCDD
BCDD
예제 3
입력
4 5
E 4
A 3
B 3
C 3
D 3
2
2 4
출력
AC
BE
DE
ED
예제 4
입력
4 6
F 1
E 3
A 3
B 3
C 3
D 3
4
1 2 3 4
출력
IMPOSSIBLE
문제 정보

riseoj 작성

출처 COCI 2008/2009 Contest 3

평가 및 의견

Matrica

개요
출제자 난이도 Unrated 레이팅 미적용 의견 0 / 1 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

Matrica

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8