Problem B. Magicka

Last-modified: 2011-07-19 (火) 12:46:20
 

概要

Magicka™ は「アローヘッドゲームスタジオ」によって開発されたアクション・アドベンチャーゲームだ。

Magicka ではあなたはウィザードである。あなたは、元素を呼び出し、それを組み合わせることで、Magicka を生み出すことができる。

Magika を生み出すには、他の方法があるかも知れないが、今回はそれはできないと仮定してよい。

問題

あなたはウィザードとして 8 つの基本元素を呼び出すことができる。
それらの元素は 「Q, W, E, R, A, S, D, F」という一文字のアルファベットで表す。

あなたが元素を呼び出す時、それがあなたの元素リストに加えられる。

たとえば、あなたが W を呼び出し、その後 A を呼び出した場合 (以降「WA を呼び出す」と略記する)、要素リストは [W, A] のようになる。

私たちは、基本元素を組み合わせで、残る 18 文字の特別な非基本元素を作ろうと思う。

たとえば、Q と F 組み合わせると T になるとする。その2つが元素リストに加えられた場合 、その2つの元素は元素リストから削除され、T によって置き換えられる。

元素リストが、[A, Q, F] もしくは [A, F, Q] の場合も、上の例と同じように Q と F が T に置き換えられ、要素リストは [A, T] となる。

私たちは、相反する基本元素の組み合わせを指定する。

あなたが元素を呼び出したあと、元素リストの末尾が組み合わせ通りになっていれば、その元素の組み合わせが呼び出されるのは既に説明した。

そしてその後、相反する元素が元素リストに存在した場合、元素リストがクリアされる。

たとえば、Q と F 組み合わせると T になるとする。
そして、R と F は相反する元素であると仮定する。

その際に、以下の元素を呼び出した場合、結果は次のようになる。

呼び出した元素呼び出した後の元素リスト補足
QF[T]Q と F が組み合わされて T になった
QEF[Q, E, F]Q と F が元素リストの末尾に連続していなかったので、組み合わせられない
RFE[E]F と R は相反する元素であるため、途中で元素リストがクリアされた
REF[]F と R は相反する元素であるため、途中で元素リストがクリアされた
RQF[R, T]QF の組み合わせにより T つくられ、リストがクリアされた
RFQ[Q]F と R は相反する元素であるため、途中で元素リストがクリアされた

あなたには、呼び出す元素の一覧が与えられた時、それを実際に呼び出したあとに、元素リストがどうなっているかを求めて欲しい。

入力

T
C s D t N u
...

1行目にはデータセットの個数 T が与えられる。
2行目から (T+1) 行目に、データセットが改行区切りで T 個与えられる。

一つのデータセットは、複数の値をスペースで区切りったものである。

初めの整数 C は元素の組み合わせの個数である。
次は C 個の文字列 s である。
s は3文字の文字列であり、たとえば「QFT」という文字列だった場合、Q と F を組み合わせると T になることを表している。

次の整数 D は相反する元素をの組み合わせの個数を表す。
次は D 個の文字列 t である。
t は2文字の文字列であり、たとえば「RF」という文字列だった場合、R と F を同時に呼び出してはいけないことを表す。

次の整数 N はあなたが呼び出す元素の個数である。
最後は、あなたが呼び出す元素を表す N 文字の文字列 u である。
あなたは、文字列 u の左から順にすべての元素を呼び出さなくてはいけない。

出力

Case #x: y
...

データセットごとに、データセットの番号 x (1 からはじまる) と、元素リスト y を出力せよ。

元素リスト y は、[A, B, C] のような形式で出力しなければいけない。
前後を括弧で囲み、値の区切りにはコンマを用いる。

制限

1 ≦ T ≦ 100

あなたが呼び出す元素 u は、非基本元素をつくる組み合わせのみで構成されるかもしれないし、相反する元素のみで構成されるかもしれない。

同じ元素同士が相反することはできない。

ゲーム版の Magickaの とは異なり、元素リストの長さに制限はない。

データセット(小)

0 ≦ C ≦ 1
0 ≦ D ≦ 1
1 ≦ N ≦ 10

データセット(大)

0 ≦ C ≦ 36
0 ≦ D ≦ 28
1 ≦ N ≦ 100

サンプル入出力

入力

5
0 0 2 EA
1 QRI 0 4 RRQR
1 QFT 1 QF 7 FAQFDFQ
1 EEZ 1 QE 7 QEEEERA
0 1 QW 2 QW

出力

Case #1: [E, A]
Case #2: [R, I, R]
Case #3: [F, D, T]
Case #4: [Z, E, R, A]
Case #5: []

ヒント

深く考えずに、問題のまま実装すればいいです。
相反の判定が、組み合わせの判定の後であることに注意。

提出・原文

http://code.google.com/codejam/contest/dashboard?c=975485#s=p1

回答例

作成者ソースコード
pine[e]fileGCJ_2011QRB_Magicka.cpp

[入力欄を追加]