记录 代码如下:
#include <cstring>
#include <string>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <stack>
#include <queue>
#include <limits.h>
#include <list>
#include <set>
#include <map>
using namespace std;
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define INF 0x3f3f3f3f
#define f1(tp,l,i,j,k) for(tp l=i;l<=j;l+=k)
#define f2(tp,l,i,j,k) for(tp l=i;l>=j;l-=k)
#define vc(tp,nm) vector<tp> nm;
#define pqg(tp,nm) priority_queue<tp,vector<tp>,greater<tp>> nm;
#define ll long long
#define pql(tp,nm) priority_queue<tp> nm;
#define qq(tp,nm) queue<tp> nm;
#define dq(tp,nm) deque<tp> nm;
#define sc scanf
#define pr printf
#define v1 first
#define v2 second
#define scl(nm) scanf("%lld",&nm)
#define sci(nm) scanf("%d",&nm)
#define prn printf("\n")
#define prl(nm) printf("%lld",nm)
#define pri(nm) printf("%d",nm)
#define prc(nm) printf("%c",nm)
#define clearq(nm,tp) queue<tp> emp;swap(nm,emp);
#define clearpair(nm,f,s) queue<pair<f,s>> emp;swap(nm,emp);
string ssss,sssss;
ll SUM,I,aaaa,Ii,recoff1;
#define sfxto10(x,nm,nm2) ssss=nm;SUM=0;I=1;while(!ssss.empty()){SUM+=int(ssss[ssss.size()-1]-'0')*I; I*=x;ssss.erase(ssss.size()-1,1);}nm2=SUM;
#define sf10tox(x,nm,nm2) aaaa=stol(nm);Ii=1; sssss="";while(Ii*x<=aaaa)Ii*=x; while(aaaa>0){if(Ii<=aaaa){recoff1=aaaa/Ii;aaaa%=Ii;sssss+=char(recoff1+'0');}else{sssss+="0";}Ii/=x;}while(Ii>0){sssss+="0";Ii/=x;}nm2=stol(sssss);
#define fxto10(x,nm,nm2) ssss=to_string(nm);SUM=0;I=1;while(!ssss.empty()){SUM+=int(ssss[ssss.size()-1]-'0')*I; I*=x;ssss.erase(ssss.size()-1,1);}nm2=SUM;
#define f10tox(x,nm,nm2) aaaa=nm;Ii=1; sssss="";while(Ii*x<=aaaa)Ii*=x; while(aaaa>0){if(Ii<=aaaa){recoff1=aaaa/Ii;aaaa%=Ii;sssss+=char(recoff1+'0');}else{sssss+="0";}Ii/=x;}while(Ii>0){sssss+="0";Ii/=x;}nm2=stol(sssss);
//using namespace std;
string rtsans;
#define str string
#define srn(nm1) nm1=rtsans;
#define stransup(nm1) transform(nm1.begin(), nm1.end(), back_inserter(rtsans), ::toupper);srn(nm1);
#define stransdown(nm1) transform(nm1.begin(), nm1.end(), back_inserter(rtsans), ::tolower);srn(nm1);
char rtans;
#define small(nm1) nm1>='a'&&nm1<='z'//used with "if"
#define nsmall(nm1) nm1<'a'||nm1>'z'//used with "if"
#define big(nm1) nm1>='A'&&nm1<='Z'//used with "if"
#define nbig(nm1) nm1<'A'||nm1>'Z'//used with "if"
#define isnum(nm1) nm1>='0'&&nm1<='9'//used with "if"
#define crn(nm1) nm1=rtans;
#define ctransup(nm1) if(small(nm1)){nm1=nm1-32;}
#define ctransdown(nm1) if(big(nm1)){nm1=nm1+32;}
#define bktsdown(nm1)nm1=nm1-26;
#define bktsup(nm1)nm1=nm1+26;
#define move(nm1,nm2) bool ok=0; if(small(nm1))ok=1;rtans=char(int(nm1)+nm2);crn(nm1);if(ok){if(nsmall(nm1)){if(nm2>0){while(nsmall(nm1))bktsdown(nm1);}else {while(nsmall(nm1))bktsup(nm1);}}}else{if(nbig(nm1)){if(nm2>0){while(nbig(nm1))bktsdown(nm1);}else{while(nbig(nm1))bktsup(nm1);}}}
//to_string() 将数字转为字符串
//stoi() 将字符串转为数字
//reverse(s.begin(),s.end()) 倒置字符串
//__gcd() 最小公倍数(不能使用)
//string::npos string类型的最大值
//n>>2相当于n/2
//n<<2相当于n*2
//0|1=1 1|0=1 1|1=1 0|0=0
//0&1=0 1&0=0 1&1=1 0|0=0
//while(scanf("%lld",&n)!=EOF)循环输入
ll a[5],ans[5],b[5][60];
vector<string> v[5];
ll res[20]={0ll,-50ll,-2ll,-3ll,-4ll,-5ll,-6ll,-7ll,-8ll,-9ll,-10ll,-20ll,-30ll,-40ll,-100ll,100ll,0ll};
ll change(string s)
{
if(s[0]=='H')
{
if(s.size()==2)
{
return (ll)(s[1]-'0');
}
else
{
if(s[1]>'1'||s[2]>'3')
return INF;
ll res=(ll)(s[1]-'0');
res=res*10+(ll)(s[2]-'0');
return res;
}
}
if(s=="S12")
{
return 14ll;
}
if(s=="D11")
{
return 15ll;
}
if(s=="C10")
{
return 16ll;
}
return INF;
}
bool check1()
{
ll sum=0;
for(ll i=1; i <= 4; i++)
{
if(!v[i].empty())
{
for(ll j=0; j < v[i].size(); j++)
{
sum+=(change(v[i][j])!=INF?change(v[i][j]):0);
}
}
}
if(sum==136)
return 1;
return 0;
}
ll allred()
{
ll ans=0;
for(ll i=1; i <= 4; i++)
{
if(!v[i].empty())
{
for(ll j=0; j <v[i].size(); j++)
{
b[i][j+1]=change(v[i][j]);
}
for(ll j=1; j <v[i].size(); j++)
{
for(ll k=j+1; k <= v[i].size(); k++)
{
if(b[i][j]>b[i][k])
{
swap(b[i][j],b[i][k]);
}
}
}
if(v[i].size()>=13)
{
if(b[i][13]==13)
{
ans=i;
}
}
}
}
return ans;
}
ll cal(ll k,ll red)
{
// cout << k << " "<< red << endl;
if(k==red)
{
if(v[k].size()>=15)
{
if(b[k][15]==15)
{
if(v[k].size()>=16)
{
if(b[k][16]==16)
{
return 1000ll;
}
return 500ll;
}
return 500ll;
}
}
if(v[k].size()>=14)
{
if(b[k][14]==14)
{
if(v[k].size()>=15)
{
if(b[k][15]==16)
{
return 200ll;
}
return 100ll;
}
return 100ll;
}
if(b[k][14]==15)
{
if(v[k].size()>=15)
{
if(b[k][15]==16)
{
return 600ll;
}
return 300ll;
}
return 300ll;
}
if(b[k][14]==16)
{
return 400ll;
}
}
return 200ll;
}
else
{
ll sum=0;
for(ll i=1; i <= v[k].size(); i++)
{
if(b[k][i]<16)
{
sum+=res[b[k][i]];
}
else
{
if(b[k][i]==16)
{
if(i==1)
{
return 50ll;
}
else
{
return sum*2;
}
}
return sum;
}
}
return sum;
}
return 0ll;
}
int main()
{
v[1].resize(0);
while(true)
{
for(ll i=1; i <= 4; i++)
{
v[i].resize(0);
}
//读入
for(ll i=1; i <= 4; i++)
{
sc("%lld",&a[i]);
for(ll j=1; j <= a[i]; j++)
{
string b;
cin >> b;
v[i].push_back(b);
}
}
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0)
{
break;
}
if(!check1())
{
pr("0 0 0 0\n");
continue;
}
ll ok;
memset(b,INF,sizeof(b));
ok=allred();
memset(ans,0,sizeof(ans));
for(ll i=1; i <= 4; i++)
{
ans[i]=cal(i,ok);
}
for(ll i=1; i <= 4; i++)
{
if(ans[i]>0)
{
pr("+%lld ",ans[i]);
}
else
{
pr("%lld ",ans[i]);
}
}
prn;
}
return 0;
}