DuLL

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

요약
프로그램 크기와 DuLL 크기, 프로그램 시작과 종료 기록이 주어질 때 적재된 DuLL을 포함한 최대 메모리 사용량을 구한다.
난이도

보통10점 중 4점

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

문제

윈도우에서 DLL(동적 링크 라이브러리)은 프로그램이 실행 중에 불러올 수 있는, 미리 컴파일된 함수들의 모음을 담은 파일이다. DLL의 두 가지 주요 장점은 다음과 같다. (1) 동시에 여러 프로그램이 같은 DLL을 사용하더라도 메모리에는 그 DLL의 사본이 하나만 있으면 된다. (2) DLL은 프로그램과 분리되어 있으므로, 그 DLL을 사용하는 프로그램을 다시 컴파일하지 않고도 독립적으로 업그레이드할 수 있다.

우리 시스템의 DLL은 특별할 것이 없다. 이 밋밋한(dull) DLL, 즉 DuLL 은 각각 고정된 크기의 메모리를 차지하며, 메모리에 올라가 있는 동안 그 크기는 변하지 않는다. 마찬가지로 각 프로그램도 자신만의 고정된 메모리 요구량을 가지며, 실행되는 동안 그 크기는 변하지 않는다. 또한 각 프로그램은 실행되는 내내 특정 DuLL들이 메모리에 올라가 있기를 요구한다. 따라서 필요한 메모리 양이 바뀌는 순간은 오직 새 프로그램이 실행될 때와, 실행 중이던 프로그램이 종료될 때뿐이다. 새 프로그램이 실행을 시작하면, 그 프로그램이 요구하는 DuLL 중 아직 메모리에 없는 것들이 모두 메모리에 올라간다. 실행 중이던 프로그램이 종료되면, 현재 실행 중인 어떤 프로그램에게도 더는 필요하지 않은 DuLL들이 메모리에서 내려간다.

특정 DuLL은 어느 순간에도 메모리에 최대 한 개의 사본만 존재한다. 다만 같은 프로그램의 여러 인스턴스가 동시에 실행될 수 있다. 이 경우 프로그램의 각 인스턴스는 자신만의 메모리를 따로 차지하지만, DuLL은 서로 무관한 두 프로그램이 공유하는 것과 똑같은 방식으로 인스턴스들 사이에서도 공유된다.

여러 프로그램을 그들이 필요로 하는 DuLL과 함께 실행할 때, 전 과정에서 사용된 최대 메모리 사용량 을 구하여라. 어느 시점의 메모리 사용량은 (현재 실행 중인 모든 프로그램 인스턴스의 크기 합)에 (현재 메모리에 올라가 있는 모든 DuLL의 크기 합)을 더한 값이다.

입력

입력은 하나 이상의 데이터 집합으로 이루어지며, 마지막에는 0 하나만 있는 줄이 온다.

각 데이터 집합의 첫 줄에는 공백으로 구분된 세 정수 NN, PP, SS 가 주어진다. NN은 사용할 수 있는 DuLL의 개수로 1≤N≤201 \le N \le 20, PP는 실행될 수 있는 프로그램의 개수로 1≤P≤91 \le P \le 9, SS는 기록된 상태 전이의 개수로 1≤S≤321 \le S \le 32 이다.

다음 줄에는 각 DuLL의 크기(바이트)를 나타내는 정수 NN개가 공백으로 구분되어 주어진다(1≤크기≤10001 \le \text{크기} \le 1000). 각 DuLL에는 순서대로 문자 라벨 'A', 'B', 'C', …, 최대 'T'까지가 암묵적으로 붙는다. 즉 첫 번째 정수는 'A'의 크기, 두 번째 정수는 'B'의 크기이며, 이런 식으로 이어진다.

다음 PP개의 줄에는 각 프로그램의 정보가 한 줄에 하나씩 주어진다. 각 줄은 프로그램의 크기(바이트, 1≤크기≤10001 \le \text{크기} \le 1000)를 나타내는 정수 하나로 시작하고, 이어서 그 프로그램이 요구하는 DuLL을 나타내는 11개 이상 NN개 이하의 문자가 온다. 프로그램 크기와 DuLL 라벨 사이에는 공백이 하나 있지만, 라벨들 사이에는 공백이 없다. 라벨의 순서는 의미가 없으며, 모두 유효한 DuLL 라벨이고, 같은 라벨이 두 번 나오지 않는다. 각 프로그램에는 순서대로 정수 라벨 1, 2, 3, …, 최대 9까지가 암묵적으로 붙는다.

각 데이터 집합의 마지막 줄에는 SS개의 정수가 공백으로 구분되어 주어진다. 각 정수는 양수 qq(1≤q≤P1 \le q \le P)이면 프로그램 qq의 새로운 실행이 시작되었음을, 음수 −q-q(1≤q≤P1 \le q \le P)이면 프로그램 qq의 실행 하나가 종료되었음을 뜻한다. 전이는 실제로 일어난 순서대로 주어진다. 모든 값은 유효한 프로그램 번호이며, 값이 음수 −q-q인 경우 그 시점에 프로그램 qq의 인스턴스가 최소 하나는 실행 중이다.

출력

각 데이터 집합마다 한 줄을 출력한다. 그 줄에는 해당 데이터 집합을 실행하는 전 과정에서 필요했던 최대 메모리 양 만을 출력한다.

예제1

  1. 예제 1

    입력
    2 2 3
    500 600
    100 A
    200 B
    2 1 2
    5 4 8
    100 400 200 500 300
    250 AC
    360 ACE
    120 AB
    40 DE
    2 3 4 -3 1 2 -2 1
    0
    
    예상 출력
    1600
    2110