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