#include <iostream>
#include <sstream>
#include <vector>
#include <tuple>
#include <cstdint>
#include <string>
#include <algorithm>
typedef std::tuple<std::uint64_t, std::uint64_t> RData;
typedef std::tuple<char, char> Data;
typedef std::vector<Data> DType;
DType GetInput(std::istream& is) {
char A = 0;
char B = 0;
DType D;
while (is >> A) {
if (!(is >> B)) break;
D.push_back({A,B});
}
return D;
}
template<int N>
bool IsMatch(DType& D) {
for (std::size_t i = 0; i < D.size(); i++) {
if (std::get<N>(D.front()) != std::get<N>(D[i])) return false;
}
return true;
}
bool Calc_rec(DType A,DType B, RData& R, std::size_t Depth) {
DType BackA=A;
DType BackB=B;
if (Depth == 0) {
if (IsMatch<0>(A))std::get<0>(R)++;
if (IsMatch<1>(A))std::get<1>(R)++;
return true;
}
if (!(IsMatch<0>(A) || IsMatch<1>(A))) return false;
for (std::size_t i = 0; i < B.size(); i++) {
A.push_back(B[i]);
B.erase(B.begin()+i);
Calc_rec(A, B, R, Depth - 1);
B.push_back(A.back());
A.pop_back();
std::sort(B.begin(), B.end());
}
return false;
}
RData Calc(DType& D) {
RData R{ 0,0 };
std::sort(D.begin(), D.end());
for (std::size_t i = 2; i<D.size(); i++) {
Calc_rec(DType(), D, R, i);
}
return R;
}
bool Show(std::string& S, RData& R) {
std::cout << S << ':' << std::get<0>(R) << ',' << std::get<1>(R) << std::endl;
return true;
}
int main() {
{
std::string S = "DAD2HAH3";
std::stringstream ss(S);
DType D = GetInput(ss);
RData R = Calc(D);
Show(S, R);
}
{
std::string S = "DAD3D8D9DJH5H8HKSASKCAC5C8CK";
std::stringstream ss(S);
DType D = GetInput(ss);
RData R = Calc(D);
Show(S, R);
}
{
std::string S = "SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT";
std::stringstream ss(S);
DType D = GetInput(ss);
RData R = Calc(D);
Show(S, R);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnR5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnVpbnQ2NF90LCBzdGQ6OnVpbnQ2NF90PiBSRGF0YTsKdHlwZWRlZiBzdGQ6OnR1cGxlPGNoYXIsIGNoYXI+IERhdGE7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8RGF0YT4gRFR5cGU7CgpEVHlwZSBHZXRJbnB1dChzdGQ6OmlzdHJlYW0mIGlzKSB7CgljaGFyIEEgPSAwOwoJY2hhciBCID0gMDsKCURUeXBlIEQ7CgoJd2hpbGUgKGlzID4+IEEpIHsKCQlpZiAoIShpcyA+PiBCKSkgYnJlYWs7CgkJRC5wdXNoX2JhY2soe0EsQn0pOwoJfQoKCXJldHVybiBEOwp9Cgp0ZW1wbGF0ZTxpbnQgTj4KYm9vbCBJc01hdGNoKERUeXBlJiBEKSB7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykgewoJCWlmIChzdGQ6OmdldDxOPihELmZyb250KCkpICE9IHN0ZDo6Z2V0PE4+KERbaV0pKSByZXR1cm4gZmFsc2U7Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKYm9vbCBDYWxjX3JlYyhEVHlwZSBBLERUeXBlIEIsIFJEYXRhJiBSLCBzdGQ6OnNpemVfdCBEZXB0aCkgewoJRFR5cGUgQmFja0E9QTsKCURUeXBlIEJhY2tCPUI7CgoJaWYgKERlcHRoID09IDApIHsKCQlpZiAoSXNNYXRjaDwwPihBKSlzdGQ6OmdldDwwPihSKSsrOwoJCWlmIChJc01hdGNoPDE+KEEpKXN0ZDo6Z2V0PDE+KFIpKys7CgkJcmV0dXJuIHRydWU7Cgl9CglpZiAoIShJc01hdGNoPDA+KEEpIHx8IElzTWF0Y2g8MT4oQSkpKSByZXR1cm4gZmFsc2U7CgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEIuc2l6ZSgpOyBpKyspIHsKCQlBLnB1c2hfYmFjayhCW2ldKTsKCQlCLmVyYXNlKEIuYmVnaW4oKStpKTsKCQlDYWxjX3JlYyhBLCBCLCBSLCBEZXB0aCAtIDEpOwoJCUIucHVzaF9iYWNrKEEuYmFjaygpKTsKCQlBLnBvcF9iYWNrKCk7CgkJc3RkOjpzb3J0KEIuYmVnaW4oKSwgQi5lbmQoKSk7Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgpSRGF0YSBDYWxjKERUeXBlJiBEKSB7CglSRGF0YSBSeyAwLDAgfTsKCglzdGQ6OnNvcnQoRC5iZWdpbigpLCBELmVuZCgpKTsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAyOyBpPEQuc2l6ZSgpOyBpKyspIHsKCQlDYWxjX3JlYyhEVHlwZSgpLCBELCBSLCBpKTsKCX0KCXJldHVybiBSOwoKfQoKYm9vbCBTaG93KHN0ZDo6c3RyaW5nJiBTLCBSRGF0YSYgUikgewoJc3RkOjpjb3V0IDw8IFMgPDwgJzonIDw8IHN0ZDo6Z2V0PDA+KFIpIDw8ICcsJyA8PCBzdGQ6OmdldDwxPihSKSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gdHJ1ZTsKfQoKaW50IG1haW4oKSB7CgkKCXsKCQlzdGQ6OnN0cmluZyBTID0gIkRBRDJIQUgzIjsKCQlzdGQ6OnN0cmluZ3N0cmVhbSBzcyhTKTsKCQlEVHlwZSBEID0gR2V0SW5wdXQoc3MpOwoJCVJEYXRhIFIgPSBDYWxjKEQpOwoJCVNob3coUywgUik7Cgl9CgkKCXsKCQlzdGQ6OnN0cmluZyBTID0gIkRBRDNEOEQ5REpINUg4SEtTQVNLQ0FDNUM4Q0siOwoJCXN0ZDo6c3RyaW5nc3RyZWFtIHNzKFMpOwoJCURUeXBlIEQgPSBHZXRJbnB1dChzcyk7CgkJUkRhdGEgUiA9IENhbGMoRCk7CgkJU2hvdyhTLCBSKTsKCX0KCQoJewoJCXN0ZDo6c3RyaW5nIFMgPSAiU0FTMlMzUzRTNVM2UzdTOFM5QzJDM0M0QzVDNkM3QzhDOUNUIjsKCQlzdGQ6OnN0cmluZ3N0cmVhbSBzcyhTKTsKCQlEVHlwZSBEID0gR2V0SW5wdXQoc3MpOwoJCVJEYXRhIFIgPSBDYWxjKEQpOwoJCVNob3coUywgUik7Cgl9CgoKCXJldHVybiAwOwoKCgoKfQ==