Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <climits>
  5. #define fr(a,b,c) for(int a = b, _ = c; a < c; a++)
  6. using namespace std;
  7. int arr[150];
  8. bool solve_spaces(string &barcode, int m)
  9. {
  10. for (int i = 5; i < m - 5; i += 6)
  11. {
  12. if (barcode[i] == '1')
  13. return false;
  14. }
  15. return true;
  16. }
  17.  
  18. bool solve_ends(string &barcode, int m)
  19. {
  20. if (barcode[2] != '1')
  21. return false;
  22. if (barcode[3] != '1')
  23. return false;
  24. if (barcode[m - 3] != '1')
  25. return false;
  26. if (barcode[m - 2] != '1')
  27. return false;
  28. return true;
  29. }
  30.  
  31. void reverse(string &barcode, int m)
  32. {
  33. int i = 0, j = m - 1;
  34. while (i <= j)
  35. {
  36. swap(barcode[i], barcode[j]);
  37. i++, j--;
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. ios::sync_with_stdio(0);
  44. int t = 0, m;
  45. map<string, char> mymap;
  46. mymap["00001"] = '0';
  47. mymap["10001"] = '1';
  48. mymap["01001"] = '2';
  49. mymap["11000"] = '3';
  50. mymap["00101"] = '4';
  51. mymap["10100"] = '5';
  52. mymap["01100"] = '6';
  53. mymap["00011"] = '7';
  54. mymap["10010"] = '8';
  55. mymap["10000"] = '9';
  56. mymap["00100"] = '-';
  57. mymap["00110"] = '*';
  58. string barcode, cpy, content, decoded, key;
  59. char val;
  60. int c, k, computed_c, computed_k;
  61. int barcode_size, n;
  62. int weight;
  63. bool ok;
  64. do
  65. {
  66. cin >> m;
  67. if (!m)
  68. continue;
  69. double nlo = INT_MAX, wlo = INT_MAX, nli = 0, whi = 0;
  70. fr(i, 0, m)
  71. {
  72. cin >> arr[i];
  73. nlo = min((double)arr[i], nlo);
  74. whi = max((double)arr[i], whi);
  75. }
  76. double limiar = (double)(nlo + whi) / 2.0;
  77. whi = 0, wlo = INT_MAX;
  78. fr(i, 0, m)
  79. {
  80. if (arr[i] < limiar)
  81. {
  82. barcode.push_back('0');
  83. wlo = min(arr[i] * 2.0, wlo);
  84. whi = max(arr[i] * 2.0, whi);
  85. }
  86. else
  87. {
  88. barcode.push_back('1');
  89. wlo = min((double)arr[i], wlo);
  90. whi = max((double)arr[i], whi);
  91. }
  92. }
  93. cout << "Case " << ++t << ": ";
  94. if (m < 29 || (m + 1) % 6 != 0 || wlo * 105.0 < whi * 95.0)
  95. {
  96. cout << "bad code" << endl;
  97. barcode.erase(barcode.begin(), barcode.end());
  98. continue;
  99. }
  100. ok = false;
  101. fr(i, 0, 2)
  102. {
  103. if (!solve_spaces(barcode, m) || !solve_ends(barcode, m))
  104. {
  105. reverse(barcode, m);
  106. }
  107. else
  108. {
  109. ok = true;
  110. break;
  111. }
  112. }
  113. if (!ok)
  114. {
  115. cout << "bad code" << endl;
  116. }
  117. else
  118. {
  119. cpy = barcode;
  120. barcode.erase(barcode.begin(), barcode.end());
  121. fr(i,0,cpy.length()){
  122. if(i%6 == 5) continue;
  123. barcode.push_back(cpy[i]);
  124. }
  125. // cout << barcode << endl;
  126. barcode_size = barcode.length();
  127. fr(i, 0, barcode_size / 5)
  128. {
  129. key = barcode.substr(i * 5, 5);
  130. val = mymap[key];
  131. if (i > 0 && i < barcode_size / 5 - 3)
  132. {
  133. decoded.push_back(val);
  134. }
  135. if (i == barcode_size / 5 - 3)
  136. {
  137. if (val == '-')
  138. c = 10;
  139. else
  140. c = val - '0';
  141. }
  142. if (i == barcode_size / 5 - 2)
  143. {
  144. if (val == '-')
  145. k = 10;
  146. else
  147. k = val - '0';
  148. }
  149. content.push_back(val);
  150. }
  151. computed_c = 0;
  152. computed_k = 0;
  153. n = decoded.length();
  154. fr(i, 1, n + 1)
  155. {
  156. val = decoded[i - 1];
  157. if (val == '-')
  158. weight = 10;
  159. else
  160. weight = val - '0';
  161. computed_c += (((n - i) % 10) + 1) * weight;
  162. computed_k += (((n - i + 1) % 9) + 1) * weight;
  163. }
  164. computed_k = (computed_k + c) % 11;
  165. computed_c = computed_c % 11;
  166. if (c == computed_c && k == computed_k)
  167. {
  168. cout << decoded << endl;
  169. }
  170. else if (c != computed_c)
  171. {
  172. cout << "bad C" << endl;
  173. }
  174. else if (k != computed_k)
  175. {
  176. cout << "bad K" << endl;
  177. }
  178. else
  179. {
  180. cout << "bad code" << endl;
  181. }
  182. }
  183. barcode.erase(barcode.begin(), barcode.end());
  184. content.erase(content.begin(), content.end());
  185. decoded.erase(decoded.begin(), decoded.end());
  186. }
  187. while (m);
  188. }
  189.  
  190. /*
  191. 59 10 20 20 10 10 10 20 10 10 20 10 10 10 10 20 10 20 10 10 10 20 10 20 10
  192. 20 10 20 10 10 10 10 10 20 10 10 10 10 10 10 20 20 10 20 10 10 20 10 10 20
  193. 10 10 10 20 10 10 20 20 10 10
  194.  
  195. 35 10 10 20 20 10 10 20 10 10 10 20 10 10 20 10 10 20 10 10 10 20 10 20 10
  196. 20 10 10 10 10 10 10 10 20 20 10 35 10 10 10 10 10 10 20 10 10 10 20 10 10
  197. 20 10 10 20 10 10 10 20 10 20 10 20 10 10 10 10 10 10 10 20 20 10 */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement