#include <bits/stdc++.h>
using namespace std;
int cp[14][14][14]; //[D残数][H残数][S残数]=完成済み数字pair数
int np[14][14][14]; //クラブ残数は計算で出す
int cv[130];
const vector<int> ppr={3,5,9,6,10,12};//{1,2,4,8} NCR(4,2)の和
int fnc(const string s){
int n=s.size() /2 ;
int sct[4] ={}; //スート計
vector<int> hns(14, 0);
for(int i=0;i<n;i++){
int crk = cv[s[2*i+1]];
//assert(crk>=0 && crk<13);
hns[crk] |= 1<< cv[s[2*i]]; //bitで管理
sct[cv[s[2*i]]]++;
}
//for(auto x : hns) printf("%d, ",x); puts("");
memset(cp, -1, sizeof cp);
cp[sct[0]][sct[1]][sct[2]] = 0;
for(auto hi: hns){
memset(np, -1, sizeof np);
for(int d=0;d<14;d++) for(int h=0;h<14;h++) for(int s=0;s<14;s++){
const int& cr = cp[d][h][s];
if(cr < 0 ) continue;
if(hi == 15){ //2pair処理
assert(d>=1 && h>=1 && s>=1);
np[d-1][h-1][s-1] = max(np[d-1][h-1][s-1], cr+2);
}
for(auto z: ppr){ //1pairを6通り
if((hi & z) == z){
bitset<6> v(z); // v[n] = z>>n &1
np[d -v[0]][h -v[1]][s -v[2]] =
max(np[d -v[0]][h -v[1]][s -v[2]], cr +1);
}
}
np[d][h][s] = max(np[d][h][s], cr); //no pairか回避
}
swap(cp, np);
}
int ans =0;
for(int d=0;d<14;d++) for(int h=0;h<14;h++) for(int s=0;s<14;s++) {
const int& cr = cp[d][h][s];
if(cr < 0 ) continue;
int cct = n - 2*cr -d - h- s; //Cクラブの残数計算
int sm = cr + d/2 + h/2 + s/2 + cct/2;
ans = max(ans, sm);
}
return ans;
}
int main()
{
memset(cv, -1, sizeof cv); //
string rs1="A23456789TJQK", rs2="DHSC";
for(int i=0;i<13;i++) cv[rs1[i]] = i;
for(int i=0;i<4 ;i++) cv[rs2[i]] = i;
//vector<int> cpr={3,5,9,6,10,12};
//for(int i=0;i<16;i++) if(__builtin_popcount(i) ==2) cpr.push_back(i);
string s;
while( cin >> s ){
cout << s <<" --> " << fnc(s) << endl;
}
return 0;
}
/*
"DAD2HAH3" -> 2
"DAD3D8D9DJH5H8HKSASKCAC5C8CK" -> 7
"SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT" -> 9
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgoKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgY3BbMTRdWzE0XVsxNF07ICAvL1tE5q6L5pWwXVtI5q6L5pWwXVtT5q6L5pWwXT3lrozmiJDmuIjjgb/mlbDlrZdwYWly5pWwCmludCBucFsxNF1bMTRdWzE0XTsgIC8v44Kv44Op44OW5q6L5pWw44Gv6KiI566X44Gn5Ye644GZCmludCBjdlsxMzBdOwpjb25zdCB2ZWN0b3I8aW50PiBwcHI9ezMsNSw5LDYsMTAsMTJ9Oy8vezEsMiw0LDh9IE5DUig0LDIp44Gu5ZKMCgoKaW50IGZuYyhjb25zdCBzdHJpbmcgcyl7CglpbnQgbj1zLnNpemUoKSAvMiA7CglpbnQgc2N0WzRdID17fTsgIC8v44K544O844OI6KiICgl2ZWN0b3I8aW50PiBobnMoMTQsIDApOyAgCglmb3IoaW50IGk9MDtpPG47aSsrKXsKCQlpbnQgY3JrID0gY3Zbc1syKmkrMV1dOwoJCS8vYXNzZXJ0KGNyaz49MCAmJiBjcms8MTMpOwoJCWhuc1tjcmtdIHw9IDE8PCBjdltzWzIqaV1dOyAvL2JpdOOBp+euoeeQhgoJCXNjdFtjdltzWzIqaV1dXSsrOwoJfQoJLy9mb3IoYXV0byB4IDogaG5zKSBwcmludGYoIiVkLCAiLHgpOyBwdXRzKCIiKTsKCW1lbXNldChjcCwgLTEsIHNpemVvZiBjcCk7CgljcFtzY3RbMF1dW3NjdFsxXV1bc2N0WzJdXSA9IDA7CgkKCWZvcihhdXRvIGhpOiBobnMpewoJCW1lbXNldChucCwgLTEsIHNpemVvZiBucCk7CgkJZm9yKGludCBkPTA7ZDwxNDtkKyspIGZvcihpbnQgaD0wO2g8MTQ7aCsrKSBmb3IoaW50IHM9MDtzPDE0O3MrKyl7CgkJCWNvbnN0IGludCYgY3IgPSBjcFtkXVtoXVtzXTsKCQkJaWYoY3IgPCAwICkgY29udGludWU7CgkJCWlmKGhpID09IDE1KXsgLy8ycGFpcuWHpueQhgoJCQkJYXNzZXJ0KGQ+PTEgJiYgaD49MSAmJiBzPj0xKTsKCQkJCW5wW2QtMV1baC0xXVtzLTFdID0gbWF4KG5wW2QtMV1baC0xXVtzLTFdLCBjcisyKTsKCQkJfQoJCQlmb3IoYXV0byB6OiBwcHIpeyAvLzFwYWly44KSNumAmuOCigoJCQkJaWYoKGhpICYgeikgPT0geil7CgkJCQkJYml0c2V0PDY+IHYoeik7IC8vIHZbbl0gPSB6Pj5uICYxCgkJCQkJbnBbZCAtdlswXV1baCAtdlsxXV1bcyAtdlsyXV0gPSAKCQkJCQltYXgobnBbZCAtdlswXV1baCAtdlsxXV1bcyAtdlsyXV0sIGNyICsxKTsKCQkJCX0KCQkJfQoJCQlucFtkXVtoXVtzXSA9IG1heChucFtkXVtoXVtzXSwgY3IpOyAvL25vIHBhaXLjgYvlm57pgb8KCQl9CgkJc3dhcChjcCwgbnApOwoJfQoKCWludCBhbnMgPTA7Cglmb3IoaW50IGQ9MDtkPDE0O2QrKykgZm9yKGludCBoPTA7aDwxNDtoKyspIGZvcihpbnQgcz0wO3M8MTQ7cysrKSB7CgkJY29uc3QgaW50JiBjciA9IGNwW2RdW2hdW3NdOwoJCWlmKGNyIDwgMCApIGNvbnRpbnVlOwoJCWludCBjY3QgPSBuIC0gMipjciAtZCAtIGgtIHM7IC8vQ+OCr+ODqeODluOBruaui+aVsOioiOeulwoJCWludCBzbSA9IGNyICsgZC8yICsgaC8yICsgcy8yICsgY2N0LzI7CgkJYW5zID0gbWF4KGFucywgc20pOwoJfQoJcmV0dXJuIGFuczsKfQoKaW50IG1haW4oKQp7CgkKCQoJbWVtc2V0KGN2LCAtMSwgc2l6ZW9mIGN2KTsgLy8KCXN0cmluZyByczE9IkEyMzQ1Njc4OVRKUUsiLCByczI9IkRIU0MiOwoJZm9yKGludCBpPTA7aTwxMztpKyspIGN2W3JzMVtpXV0gPSBpOwoJZm9yKGludCBpPTA7aTw0IDtpKyspIGN2W3JzMltpXV0gPSBpOwoJLy92ZWN0b3I8aW50PiBjcHI9ezMsNSw5LDYsMTAsMTJ9OwoJLy9mb3IoaW50IGk9MDtpPDE2O2krKykgaWYoX19idWlsdGluX3BvcGNvdW50KGkpID09MikgY3ByLnB1c2hfYmFjayhpKTsKCQoJc3RyaW5nIHM7Cgl3aGlsZSggY2luID4+IHMgKXsKCQljb3V0IDw8IHMgPDwiIC0tPiAiIDw8IGZuYyhzKSA8PCBlbmRsOwoJfQoJcmV0dXJuIDA7Cn0KLyoKIkRBRDJIQUgzIiAtPiAyCiJEQUQzRDhEOURKSDVIOEhLU0FTS0NBQzVDOENLIiAtPiA3CiJTQVMyUzNTNFM1UzZTN1M4UzlDMkMzQzRDNUM2QzdDOEM5Q1QiIC0+IDkKKi8K