fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. typedef pair<int,int> pii;
  6. const int arr = 1e6+1;
  7. const ll mod = 1e9+7;
  8. const ll maxv = 1e18+1;
  9. #define fi first
  10. #define se second
  11. #define vi vector<int>
  12. #define pb push_back
  13. #define mp make_pair
  14. #define all(v) v.begin(), v.end()
  15. #define no "NO\n"
  16. #define yes "YES\n"
  17. #define ld long double
  18. #define mat vector<vector<ll>>
  19. int m, n;
  20. string board[18], h[2];
  21. map<char, int> mark;
  22. vector<ll> mask(4, 0);
  23. ld four = 0, full = 0, straight = 0, sum = 0;
  24. vector<pii> path;
  25.  
  26. int suittonum(char c){
  27. if(c == 'd') return 1;
  28. else if(c == 'h') return 2;
  29. else if(c == 's') return 3;
  30. return 0;
  31. }
  32.  
  33. int valtonum(char c){
  34. if(c == 'T') return 10;
  35. else if(c == 'J') return 11;
  36. else if(c == 'Q') return 12;
  37. else if(c == 'K') return 13;
  38. else if(c == 'A') return 1;
  39. return (c - '0');
  40. }
  41.  
  42. ld C(int n, int k){
  43. if(k < 0 || k > n) return 0;
  44. k = min(k, n-k);
  45. ld res = 1;
  46. for(int i = 1; i <= k; ++i){
  47. res = res * (n - k + i) / i;
  48. }
  49. return res;
  50. }
  51.  
  52. void Try(int id, int k, int start){
  53. for(int idx = start; idx < 52; ++idx){
  54. int i = idx/13;
  55. int j = idx % 13;
  56. if(mask[i] & (1ll << j)) continue;
  57. mask[i] |= (1ll << j);
  58. if(id == k){
  59. bool valid = false;
  60. /** 4 of a kind **/
  61. for(int num = 0; num < 13; ++num){
  62. int cnt = 0;
  63. for(int s = 0; s < 4; ++s){
  64. if(mask[s] & (1ll << num)) cnt++;
  65. }
  66. if(cnt == 4){
  67. four++;
  68. valid = true;
  69. // cout << "4 of a kind " << num << endl;
  70. break;
  71. }
  72. }
  73. /** Full house **/
  74. vi two, three;
  75. for(int num = 0; num < 13; ++num){
  76. int cnt = 0;
  77. for(int s = 0; s < 4; ++s){
  78. if(mask[s] & (1ll << num)) cnt++;
  79. }
  80. if(cnt >= 2) two.pb(num);
  81. if(cnt >= 3) three.pb(num);
  82. }
  83. bool found = false;
  84. for(int card : three){
  85. if(found) break;
  86. for(int card2 : two){
  87. if(card != card2){
  88. full++;
  89. found = true;
  90. valid = true;
  91. break;
  92. }
  93. }
  94. }
  95. /** Straight flush **/
  96. for(int s = 0; s < 4; ++s){
  97. for(int num = 0; num < 10; ++num){
  98. int cnt = ((mask[s] >> (num)) & 1);
  99. cnt += ((mask[s] >> (num+1)) & 1);
  100. cnt += ((mask[s] >> (num+2)) & 1);
  101. cnt += ((mask[s] >> (num+3)) & 1);
  102. if(num == 9) cnt += ((mask[s] >> 0) & 1);
  103. else cnt += ((mask[s] >> (num+4)) & 1);
  104. if(cnt == 5){
  105. // cout << "Straight straight " << s << " " << num << endl;
  106. straight++;
  107. valid = true;
  108. break;
  109. }
  110. }
  111. }
  112. if(valid) sum++;
  113. }
  114. else Try(id+1, k, idx+1);
  115. mask[i] ^= (1ll << j);
  116. }
  117. }
  118.  
  119. void read(){
  120. cin >> m;
  121. cin >> h[0] >> h[1];
  122. cin >> n;
  123. for(int i = 0; i < n; ++i) cin >> board[i];
  124. if(m == 1){
  125. for(int i = 0; i < 2; ++i) mark[h[i][0]]++;
  126. for(int i = 0; i < n; ++i) mark[board[i][0]]++;
  127. double prob = 0;
  128. for(auto id = mark.begin(); id != mark.end(); ++id)
  129. if(id->second == 4) prob = 1;
  130. cout << fixed << setprecision(15) << prob;
  131. }
  132. else if(m == 2){
  133. double prob = 0;
  134. int cnt3 = 0, cnt2 = 0, cnt4 = 0;
  135. map<string, int> freq;
  136. for(int i = 0; i < 2; ++i) mark[h[i][0]]++, freq[h[i]]++;
  137. for(int i = 0; i < n; ++i) mark[board[i][0]]++, freq[board[i]]++;
  138. for(auto id = mark.begin(); id != mark.end(); ++id){
  139. if(id->second == 4) cnt4++;
  140. else if(id->second == 2) cnt2++;
  141. else if(id->second == 3) cnt3++;
  142. }
  143. if(cnt4 || cnt2 && cnt3) prob = 1;
  144. for(int i = 1; i <= 10 && !prob; ++i){
  145. for(int k = 0; k < 4; ++k){
  146. char suit = 'c';
  147. if(k == 1) suit = 'd';
  148. else if(k == 2) suit = 'h';
  149. else if(k == 3) suit = 's';
  150. int cnt = 0;
  151. for(int j = i; j <= i+4; ++j){
  152. char c;
  153. if(j == 10) c = 'T';
  154. else if(j == 11) c = 'J';
  155. else if(j == 12) c = 'Q';
  156. else if(j == 13) c = 'K';
  157. else if(j == 14 || j == 1) c = 'A';
  158. else c = j + '0';
  159. string tmp = "";
  160. tmp += c; tmp += suit;
  161. if(freq.find(tmp) != freq.end()) ++cnt;
  162. }
  163. if(cnt == 5){
  164. prob = 1;
  165. break;
  166. }
  167. }
  168. }
  169. cout << fixed << setprecision(15) << prob;
  170. }
  171. else if(m == 3 || m == 4 || m == 6 || m == 9 || m == 10 || m == 11){
  172. for(int i = 0; i < 2; ++i){
  173. int suit = suittonum(h[i][1]);
  174. int val = valtonum(h[i][0]);
  175. mask[suit] |= (1ll << (val-1));
  176. }
  177. int k = 0;
  178. for(int i = 0; i < n; ++i){
  179. if(board[i][0] == '?'){
  180. ++k;
  181. continue;
  182. }
  183. int suit = suittonum(board[i][1]);
  184. int val = valtonum(board[i][0]);
  185. mask[suit] |= (1ll << (val-1));
  186. }
  187. int rest = 52 - (n + 2 - k);
  188. ld choice = C(rest, k);
  189. Try(1, k, 0);
  190. ld prob;
  191. if(m == 3) prob = four/choice;
  192. else if(m == 4 || m == 6) prob = straight/choice;
  193. else prob = sum/choice;
  194. if(prob > 1.0) prob = 1.0;
  195. cout << fixed << setprecision(15) << prob;
  196. }
  197. else if(m == 5){
  198.  
  199. }
  200. else if(m == 7){
  201.  
  202. }
  203. else if(m == 8){
  204.  
  205. }
  206. else if(m == 12){
  207.  
  208. }
  209. }
  210.  
  211. signed main(){
  212. cin.tie(nullptr)->sync_with_stdio(false);
  213. read();
  214. return 0;
  215. }
  216.  
Success #stdin #stdout 0.01s 5320KB
stdin
9
7d 8d
11
5d ? Qc 2d Kh Ad ? 8c 9c 8s 6d
stdout
0.898780487804878