ololo.cpp
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <cstring>
#include <string>
#include <map>
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define FI(i,b) FOR(i,0,b)
#define V(t) vector < t >
#define pb push_back
#define MEMS(a,b) memset((a),(b),sizeof(a))
#define U unsigned
#define LL long long
#define pnt pair<int,int>
#define mp make_pair
using namespace std;
map<char,int> mm;
vector<vector<pnt > > players;
pair<int,vector<int> > have[20];
pair<bool, vector<int> > isOneCard(vector<pnt > a)
{
vector<int > b;
FOR(i,0,5)
b.push_back(a[i].first);
return mp(true,b);
}
pair<bool, vector<int> > isPair(vector<pnt > a)
{
vector<int> b;
FOR(i,0,(int)a.size()-1)
{
if (a[i].first==a[i+1].first)
{
b.push_back(a[i].first);
FOR(j,0,(int)a.size())
{
if ((j!=i) && (j!=i+1) && (b.size()!=4))
b.push_back(a[j].first);
}
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isTwoPairs(vector<pnt > a)
{
vector<int> b;
FOR(i,0,(int)a.size()-1)
{
if (a[i].first==a[i+1].first)
{
FOR(j,i+2,(int)a.size()-1)
if (a[j].first==a[j+1].first)
{
b.push_back(a[j].first);
b.push_back(a[i].first);
FOR(k,0,a.size())
{
if ((k!=i) && (k!=i+1) && (k!=j) && (k!=j+1) && (b.size()!=3))
b.push_back(a[k].first);
}
return mp(true,b);
}
}
}
return mp(false,b);
}
pair<bool, vector<int> > isThree(vector<pnt > a)
{
vector<int> b;
FOR(i,0,(int)a.size()-2)
{
if ((a[i].first==a[i+1].first) && (a[i].first==a[i+2].first))
{
b.push_back(a[i].first);
FOR(j,0,(int)a.size())
{
if ((j!=i) && (j!=i+1) && (j!=i+2) && (b.size()!=3))
b.push_back(a[j].first);
}
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isStraight(vector<pnt > a)
{
vector<int > b;
FOR(i,0,a.size()-4)
{
bool f=true;
FOR(j,0,4)
if (a[i+j].first!=a[i+j+1].first+1)
{
f=false;
break;
}
if (f)
{
b.push_back(a[i].first);
return mp(true,b);
}
}
bool isace=false;
FOR(i,0,a.size())
if (a[i].first==14)
isace=true;
if (!isace)
return mp(false,b);
FOR(i,0,a.size()-5)
{
if (a[i].first!=5)
continue;
bool f=true;
FOR(j,0,3)
if (a[i+j].first!=a[i+j+1].first+1)
{
f=false;
break;
}
if (f)
{
b.push_back(a[i].first);
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isFlush(vector<pnt > a)
{
//FOR(i,0,a.size())
// cout<<a[i].second<<" ";
//cout<<endl;
vector<int> b;
FOR(i1,0,a.size())
FOR(i2,i1+1,a.size())
FOR(i3,i2+1,a.size())
FOR(i4,i3+1,a.size())
FOR(i5,i4+1,a.size())
{
if ((a[i1].second==a[i2].second) && (a[i1].second==a[i3].second) && (a[i1].second==a[i4].second) && (a[i1].second==a[i5].second))
{
/*cout<<a[i1].first<<" ";
cout<<a[i2].first<<" ";
cout<<a[i3].first<<" ";
cout<<a[i4].first<<" ";
cout<<a[i5].first<<" ";*/
b.push_back(a[i1].first);
b.push_back(a[i2].first);
b.push_back(a[i3].first);
b.push_back(a[i4].first);
b.push_back(a[i5].first);
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isFullHouse(vector<pnt > a)
{
vector<int> b;
FOR(i,0,(int)a.size()-2)
{
if ((a[i].first==a[i+1].first) && (a[i].first==a[i+2].first))
FOR(j,0,(int)a.size()-1)
if ((j!=i) && (j!=i+1) && (j!=i+2) && (a[j].first==a[j+1].first))
{
b.push_back(a[i].first);
b.push_back(a[j].first);
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isPoker(vector<pnt > a)
{
vector<int> b;
FOR(i,0,(int)a.size()-3)
{
if ((a[i].first==a[i+1].first) && (a[i].first==a[i+2].first) && (a[i].first==a[i+3].first))
{
b.push_back(a[i].first);
FOR(j,0,(int)a.size())
{
if ((j!=i) && (j!=i+1) && (j!=i+2) && (j!=i+3) && (b.size()!=2))
b.push_back(a[j].first);
}
return mp(true,b);
}
}
return mp(false,b);
}
pair<bool, vector<int> > isRoyalFlush(vector<pnt > a)
{
vector<int> b;
FOR(i1,0,a.size())
FOR(i2,i1+1,a.size())
FOR(i3,i2+1,a.size())
FOR(i4,i3+1,a.size())
FOR(i5,i4+1,a.size())
{
if ((a[i1].second==a[i2].second) && (a[i1].second==a[i3].second) && (a[i1].second==a[i4].second) && (a[i1].second==a[i5].second))
{
/*cout<<a[i1].first<<" ";
cout<<a[i2].first<<" ";
cout<<a[i3].first<<" ";
cout<<a[i4].first<<" ";
cout<<a[i5].first<<" ";*/
if ((a[i1].first-1==a[i2].first) && (a[i2].first-1==a[i3].first) && (a[i3].first-1==a[i4].first) && (a[i4].first-1==a[i5].first))
{
b.push_back(a[i1].first);
b.push_back(a[i2].first);
b.push_back(a[i3].first);
b.push_back(a[i4].first);
b.push_back(a[i5].first);
return mp(true,b);
}
if ((a[i1].first==14) && (a[i5].first==2) && (a[i2].first-1==a[i3].first) && (a[i3].first-1==a[i4].first) && (a[i4].first-1==a[i5].first))
{
b.push_back(a[i2].first);
b.push_back(a[i3].first);
b.push_back(a[i4].first);
b.push_back(a[i5].first);
b.push_back(a[i1].first);
}
}
}
return mp(false,b);
}
int main()
{
FOR(i,2,10)
mm['0'+i]=i;
mm['X']=10;
mm['J']=11;
mm['Q']=12;
mm['K']=13;
mm['A']=14;
//sort them all!!!
/*vector<pnt > b;
FOR(i,0,7)
string s;
cin>>s;
//cout<<s<<endl;
int v2=0;
if (s[1]=='d')
v2=1;
if (s[1]=='h')
v2=2;
if (s[1]=='s')
v2=3;
c.push_back(mp(mm[s[0]],v2));
}
{
string s;
cin>>s;
//cout<<s<<endl;
int v2=0;
if (s[1]=='d')
v2=1;
if (s[1]=='h')
v2=2;
if (s[1]=='s')
v2=3;
b.push_back(mp(mm[s[0]],v2));
//cout<<v2<<endl;
}
sort(b.rbegin(),b.rend());
pair<bool,vector<int> > a=isRoyalFlush(b);
cout<<a.first<<endl;
FOR(i,0,a.second.size())
cout<<a.second[i]<<" ";
cout<<endl;*/
int n;
while (scanf("%d",&n)!=EOF)
{
players.clear();
players.resize(n);
vector<pnt > c;
FOR(it,0,5)
{
string s;
cin>>s;
//cout<<s<<endl;
int v2=0;
if (s[1]=='d')
v2=1;
if (s[1]=='h')
v2=2;
if (s[1]=='s')
v2=3;
c.push_back(mp(mm[s[0]],v2));
}
FOR(i,0,n)
{
players[i]=c;
//cout<<v2<<endl;
FOR(it,0,2)
{
string s;
cin>>s;
//cout<<s<<endl;
int v2=0;
if (s[1]=='d')
v2=1;
if (s[1]=='h')
v2=2;
if (s[1]=='s')
v2=3;
players[i].push_back(mp(mm[s[0]],v2));
}
sort(players[i].rbegin(),players[i].rend());
}
FOR(i,0,n)
{
pair<bool, vector<int> > tmp;
tmp=isRoyalFlush(players[i]);
if (tmp.first)
{
have[i].first=9;
have[i].second=tmp.second;
continue;
}
tmp=isPoker(players[i]);
if (tmp.first)
{
have[i].first=8;
have[i].second=tmp.second;
continue;
}
tmp=isFullHouse(players[i]);
if (tmp.first)
{
have[i].first=7;
have[i].second=tmp.second;
continue;
}
tmp=isFlush(players[i]);
if (tmp.first)
{
have[i].first=6;
have[i].second=tmp.second;
continue;
}
tmp=isStraight(players[i]);
if (tmp.first)
{
have[i].first=5;
have[i].second=tmp.second;
continue;
}
tmp=isThree(players[i]);
if (tmp.first)
{
have[i].first=4;
have[i].second=tmp.second;
continue;
}
tmp=isTwoPairs(players[i]);
if (tmp.first)
{
have[i].first=4;
have[i].second=tmp.second;
continue;
}
tmp=isPair(players[i]);
if (tmp.first)
{
have[i].first=4;
have[i].second=tmp.second;
continue;
}
tmp=isOneCard(players[i]);
if (tmp.first)
{
have[i].first=4;
have[i].second=tmp.second;
continue;
}
}
vector<int> res;
FOR(i,0,n)
{
bool f=true;
FOR(j,0,n)
if (i!=j)
if (have[i]<have[j])
f=false;
if (f)
res.push_back(i+1);
}
FOR(i,0,res.size())
{
if (i)
printf(" ");
printf("%d",res[i]);
}
printf("\n");
}
return 0;
}