2218-K Poker

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2218
問題概要

考え方
Wikipediaに書いてあることを参考に実装する。
トランプをあらかじめソートしておくと楽に判定出来る。
実装(C++)

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
typedef long long int lli;
typedef unsigned int uint;

enum MARK{SPADE,CLUB,HEART,DIAMOND};
const char MARK_CHAR[4]={'S','C','H','D'};
const char VAL_CHAR[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
struct Trump{
	MARK mark;
	int val;
	Trump(MARK m,int v){mark=m;val=v;}
	Trump(){}
	Trump(string in){
		char m=in[1],v=in[0];
		for(int i=0;i<4;i++)
			if(MARK_CHAR[i]==m)mark=(MARK)i;
		for(int i=0;i<13;i++)
			if(VAL_CHAR[i]==v)val=i+1;
	}
	string toString(){
		string res="";
		res=res+MARK_CHAR[(int)mark]+VAL_CHAR[val];return res;
	}
};
bool operator<(Trump a,Trump b){
	if(a.val==b.val)return a.mark<b.mark;
	return a.val<b.val;
}
bool operator>(Trump b,Trump a){return a<b;}
//0:ノーペア 1:ワンペア 2:ツーペア 3:スリーカード 4:ストレート 5:フラッシュ 6:フルハウス 7:フォーカード 8:ストレートフラッシュ 9:ロイヤルストレートフラッシュ
int checkpoker(vector<Trump> cards){
	std::sort(cards.begin(),cards.end());
	if(cards[0].mark==cards[1].mark&&cards[0].mark==cards[2].mark&&cards[0].mark==cards[3].mark&&cards[0].mark==cards[4].mark){
		if(cards[0].val==1&&cards[1].val==10&&cards[2].val==11&&cards[3].val==12&&cards[4].val==13)return 9;
		if(cards[4].val-cards[3].val==1&&cards[3].val-cards[2].val==1&&cards[2].val-cards[1].val==1&&cards[1].val-cards[0].val==1)return 8;}
	if(cards[0].val==cards[3].val||cards[1].val==cards[4].val)return 7;
	if((cards[0].val==cards[2].val&&cards[3].val==cards[4].val)||(cards[0].val==cards[1].val&&cards[2].val==cards[4].val))return 6;
	if(cards[0].mark==cards[1].mark&&cards[0].mark==cards[2].mark&&cards[0].mark==cards[3].mark&&cards[0].mark==cards[4].mark)return 5;
	if(cards[0].val==1&&cards[1].val==10&&cards[2].val==11&&cards[3].val==12&&cards[4].val==13)return 4;
	if(cards[4].val-cards[3].val==1&&cards[3].val-cards[2].val==1&&cards[2].val-cards[1].val==1&&cards[1].val-cards[0].val==1)return 4;
	if(cards[0].val==cards[2].val||cards[1].val==cards[3].val||cards[2].val==cards[4].val)return 3;
	if((cards[0].val==cards[1].val&&cards[2].val==cards[3].val)||(cards[1].val==cards[2].val&&cards[3].val==cards[4].val)||(cards[0].val==cards[1].val&&cards[3].val==cards[4].val))return 2;
	if((cards[0].val==cards[1].val)||(cards[1].val==cards[2].val)||(cards[2].val==cards[3].val)||(cards[3].val==cards[4].val))return 1;
	return 0;
}

int pts[4][13];
int ans[10];
int main(){
	ans[0]=0;
	int s=0;
	for(int n;cin>>n;s++){
		if(s)cout<<endl;
		for(int i=0;i<4;i++)
			for(int j=0;j<13;j++)cin>>pts[i][j];
		for(int i=1;i<=9;i++)cin>>ans[i];
		vector<Trump> cards(5);
		for(int k=0;k<n;k++){
			int base=0;
			for(int i=0;i<5;i++){
				string t;
				cin>>t;
				cards[i]=Trump(t);
				base+=pts[(int)cards[i].mark][cards[i].val-1];
			}
			cout << ans[checkpoker(cards)]*base<<endl;
		}
	}
	return 0;
}