Problem:
Problem C: K Poker

Description

時は200X年、K大学で活動する謎のサークルKはその大学の文化祭の最中にK東4Fで彼らが作成した新たなゲーム、Kポーカーを発表した。

このゲームは一見すると普通のポーカーであるが、カードに基本点という要素をつけてポーカーをより奥の深いゲームにしたものである。

カードの基本点はそれぞれのカードに書かれている絵柄によって決まり、手札の点数は手札にある5枚の基本点の合計に手札の役の倍率を掛けたものになる。

この基本点を導入した事により、例えばフルハウスなどの強い役を作ったとしても基本点が0であればブタと同様に扱われてしまい、ワンペアに負けることさえある。

それ以外のルールは通常のポーカーと同じである。

このKポーカーをPCに移植しようと思ったあなたは手札の点数を計算するプログラムを書く事にした。

なおこのゲームは18歳未満の人はプレイ出来ない。

Input

入力は複数のテストケースからなる。

各テストケースの最初の行にはチェックする手札の数Nが書かれている。

次の4行には13個の整数が並びカードの基本点が1-13の順に並んで書かれている。4行のスーツは上から順にスペード、クローバー、ハート、ダイヤの順に並んでいる。

次の行には9個の整数が並び、順にワンペア、ツーペア、スリーカード、ストレート、フラッシュ、フルハウス、フォーカード、ストレートフラッシュ、ロイヤルストレートフラッシュの倍率を表している。役の倍率は必ず昇順となっている。ブタ(役無し、ノーペア)の倍率は常に0である。

次のN行には手札を表す5個の長さ2の異なる文字列が並んでいる。1文字目はカードの数値を表し,A,2,3,4,5,6,7,8,9,T,J,Q,Kのいずれかである。2文字目はカードのスーツを表し、S,C,H,Dのいずれかである。各アルファベットはAはエース、Tは10、Jはジャック、Qはクイーン、Kはキング、Sはスペード、Cはクローバー、Hはハート、Dはダイヤを表す。

入力の数値は全て[0,10000]の範囲に収まっている。

入力はEOFで終わる。

Output

各手札の点数を1行ずつ出力せよ。

連続する2つのテストケースの間には空行を1つ入れること。

役についてはwikipediaのポーカーのページを参照のこと。
なお、ストレートはエースとキングをまたぐ場合があるが、手札が10,ジャック、クイーン、キング、エースの場合にのみストレートとみなされる。

Sample Input

3
0 1 0 1 0 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 1 0 0 2
0 1 1 0 1 1 1 0 0 0 0 5 5
3 1 1 1 0 1 0 0 1 0 3 0 2
1 1 2 4 5 10 20 50 100
7H 6H 2H 5H 3H
9S 9C 9H 8H 8D
KS KH QH JD TS
10
1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8 9
AS 3D 2C 5D 6H
6S 6C 7D 8H 9C
TS TD QC JD JC
KD KH KC AD 2C
3D 4H 6D 5H 7C
2S KS QS AS JS
TS TD JD JC TH
8H 8D TC 8C 8S
4S 5S 3S 7S 6S
KD QD JD TD AD

Output for Sample Input

25
0
14

0
5
10
15
20
25
30
35
40
45

Solution in C (judge verdict: Wrong Answer)

// Aizu 2218: K Poker
// 2017.9.23 bal4u@uu
// ?????????????????????????????\????????????????????????????????????????????????

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct { int d, s; } T;	// ??????????????± d:?????° s:?????????
T card[5];
int base[4][14];	// ?????¬???????????±
int rate[9];		// ??????????????±

int dcnt[14];		// ????????°????????????????????????
int scnt[4];		// ????????????????????????????????????
int tr['Z'+1];		// ????????¨

int cmp(T *a, T *b) { return a->d - b->d; }

int main()
{
	int n, i, j, f, ans;
	char s[3];
	int cno = 0;

	tr['S'] = 0, tr['C'] = 1,  tr['H'] = 2,  tr['D'] = 3;
	for (i = 0; i <= 9; i++) tr[i+'0'] = i;
	tr['A'] = 1, tr['T'] = 10, tr['J'] = 11, tr['Q'] = 12, tr['K'] = 13;

	while (scanf("%d", &n) == 1) {
		if (cno++) putchar('\n');		// ???????????±??????????????????

		for (i = 0; i < 4; i++) for (j = 0; j < 13; j++) scanf("%d", &base[i][j+1]);
		for (i = 0; i < 9; i++) scanf("%d", rate+i);
		while (n-- > 0) {
			for (i = 0; i < 5; i++) {			// ??????????????±
				scanf("%s", s); 
				card[i].d = tr[s[0]], card[i].s = tr[s[1]];
			}
			for (i = 0; i < 4; i++) qsort(card, 5, sizeof(T), cmp);  // ?????°??§???????????????
			memset(dcnt, 0, sizeof(dcnt));
			for (i = 0; i < 5; i++) dcnt[card[i].d]++;		// ???????????°????????°???????¨?
			memset(scnt, 0, sizeof(scnt));
			for (i = 0; i < 5; i++) scnt[card[i].s]++;		// ???????????????????????°???????¨?

			ans = 0;
			// ?????¬???
			for (i = 0; i < 5; i++)	ans += base[card[i].s][card[i].d];

			// ????????????????????¬????????????????????\
			if (card[0].d == 1) {
				for (i = 1; ; i++) {
					if (i == 5) { ans *= rate[8]; goto Done; }
					if (card[i].s != card[0].s || card[i].d != 9+i) break;
				}
			}

			// ????????¬????????????????????\
			if (card[0].d != 1) {
				for (i = 1; ; i++) {
					if (i == 5) { ans *= rate[7]; goto Done; }
					if (card[i].s != card[0].s || card[i].d != card[0].d+i) break;
				}
			}

			// ??????????????????
			for (i = 1; i <= 13; i++) if (dcnt[i] == 4) { ans *= rate[6]; goto Done; }
			
			// ???????????????
			f = 0;
			for (i = 1; i <= 13; i++) {
				if (dcnt[i] == 3) f |= 1;
				if (dcnt[i] == 2) f |= 2;
			}
			if (f == 3) { ans *= rate[5]; goto Done; }

			// ??????????????\
			for (i = 0; i < 4; i++) if (scnt[i] == 5) { ans *= rate[4]; goto Done; }

			// ????????¬??????
			if (card[0].d == 1) {
				for (i = 1; ; i++) {
					if (i == 5) { ans *= rate[3]; goto Done; }
					if (card[i].d != 9+i) break;
				}
			} else {
				for (i = 1; ; i++) {
					if (i == 5) { ans *= rate[3]; goto Done; }
					if (card[i].d != card[0].d+i) break;
				}
			}

			// ??????????????????
			for (i = 1; i <= 13; i++) if (dcnt[i] == 3) { ans *= rate[2]; goto Done; }

			// ???????????¢ or ???????????¢
			f = 0;
			for (i = 1; i <= 13; i++) if (dcnt[i] == 2) f++;
			if      (f == 2) { ans *= rate[1]; goto Done; }
			else if (f == 1) { ans *= rate[0]; goto Done; }

			// ??????
			ans = 0;

Done:		printf("%d\n", ans);
		}
	}
	return 0;
}