fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <vector>
  4. #include <tuple>
  5. #include <cstdint>
  6. #include <string>
  7. #include <algorithm>
  8. #include <map>
  9.  
  10. typedef std::tuple<std::uint64_t, std::uint64_t> RData;
  11. typedef std::tuple<char, char> Data;
  12. typedef std::vector<Data> DType;
  13.  
  14. DType GetInput(std::istream& is) {
  15. char A = 0;
  16. char B = 0;
  17. DType D;
  18.  
  19. while (is >> A) {
  20. if (!(is >> B)) break;
  21. D.push_back({A,B});
  22. }
  23.  
  24. return D;
  25. }
  26.  
  27. template<int N>
  28. bool IsMatch(DType& D) {
  29. for (std::size_t i = 0; i < D.size(); i++) {
  30. if (std::get<N>(D.front()) != std::get<N>(D[i])) return false;
  31. }
  32. return true;
  33. }
  34.  
  35. bool Calc_rec(DType A,DType B, RData& R, std::size_t Depth) {
  36.  
  37. if (Depth == 0) {
  38. if (IsMatch<0>(A))std::get<0>(R)++;
  39. if (IsMatch<1>(A))std::get<1>(R)++;
  40. return true;
  41. }
  42. if (!(IsMatch<0>(A) || IsMatch<1>(A))) return false;
  43.  
  44. for (std::size_t i = 0; i < B.size(); i++) {
  45. A.push_back(B[i]);
  46. B.erase(B.begin()+i);
  47. Calc_rec(A, B, R, Depth - 1);
  48. B.push_back(A.back());
  49. A.pop_back();
  50. std::sort(B.begin(), B.end());
  51. }
  52.  
  53. return false;
  54. }
  55.  
  56. template<int N>
  57. std::size_t Count(DType& D) {
  58. std::map<char, std::size_t> M;
  59. std::size_t C = 0;
  60. for (auto& o : D) {
  61. M[std::get<N>(o)]++;
  62. }
  63.  
  64. for (auto& o : M) {
  65. C = std::max(o.second, C);
  66. }
  67. return C;
  68. }
  69.  
  70. RData Calc(DType& D) {
  71. RData R{ 0,0 };
  72.  
  73. std::sort(D.begin(), D.end());
  74.  
  75. std::size_t A = Count<0>(D);
  76. std::size_t B = Count<1>(D);
  77. std::size_t C = std::max(A, B);
  78.  
  79. for (std::size_t i = 2; i<C+1; i++) {
  80. Calc_rec(DType(), D, R, i);
  81. }
  82. return R;
  83.  
  84. }
  85.  
  86. bool Show(std::string& S, RData& R) {
  87. std::cout << S << ':' << std::get<0>(R) << ',' << std::get<1>(R) << std::endl;
  88. return true;
  89. }
  90.  
  91. int main() {
  92.  
  93. {
  94. std::string S = "DAD2HAH3";
  95. std::stringstream ss(S);
  96. DType D = GetInput(ss);
  97. RData R = Calc(D);
  98. Show(S, R);
  99. }
  100.  
  101. {
  102. std::string S = "DAD3D8D9DJH5H8HKSASKCAC5C8CK";
  103. std::stringstream ss(S);
  104. DType D = GetInput(ss);
  105. RData R = Calc(D);
  106. Show(S, R);
  107. }
  108.  
  109. {
  110. std::string S = "SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT";
  111. std::stringstream ss(S);
  112. DType D = GetInput(ss);
  113. RData R = Calc(D);
  114. Show(S, R);
  115. }
  116.  
  117. return 0;
  118. }
Success #stdin #stdout 2.56s 15248KB
stdin
Standard input is empty
stdout
DAD2HAH3:4,2
DAD3D8D9DJH5H8HKSASKCAC5C8CK:394,38
SAS2S3S4S5S6S7S8S9C2C3C4C5C6C7C8C9CT:1972800,16