Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.63 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class C implements Runnable {
  5. String[] digits = new String[10];
  6. String EMPTY = ".......";
  7. {
  8. digits[0] = "---.---";
  9. digits[1] = "..-..-.";
  10. digits[2] = "-.---.-";
  11. digits[3] = "-.--.--";
  12. digits[4] = ".---.-.";
  13. digits[5] = "--.-.--";
  14. digits[6] = "--.----";
  15. digits[7] = "-.-..-.";
  16. digits[8] = "-------";
  17. digits[9] = "----.--";
  18. }
  19.  
  20. private String getTime(int time) {
  21. int hours = time / 60;
  22. int minutes = time % 60;
  23. String res = "";
  24. if (hours < 10) {
  25. res = EMPTY + digits[hours % 10];
  26. } else {
  27. res = digits[hours / 10] + digits[hours % 10];
  28. }
  29. res += digits[minutes / 10] + digits[minutes % 10];
  30. return res;
  31. }
  32.  
  33. private void solution() throws IOException {
  34. while (true) {
  35. int n = in.nextInt();
  36. if (n == 0) {
  37. break;
  38. }
  39. String[] times = new String[n];
  40. int[] min = new int[n - 1];
  41. int[] max = new int[n - 1];
  42. for (int i = 0; i < n; ++i) {
  43. times[i] = readTime();
  44. if (i + 1 < n) {
  45. min[i] = in.nextInt();
  46. max[i] = in.nextInt();
  47. }
  48. }
  49. boolean[][] from = new boolean[n][24 * 60];
  50. boolean[][] to = new boolean[n][24 * 60];
  51. for (int time = 0; time < 24 * 60; ++time) {
  52. if (match(getTime(time), times[0])) {
  53. from[0][time] = true;
  54. }
  55. }
  56. int MOD = 24 * 60;
  57. for (int i = 0; i < n - 1; ++i) {
  58. for (int time = 0; time < from[i].length; ++time) {
  59. if (from[i][time]) {
  60. for (int dx = min[i]; dx <= max[i]; ++dx) {
  61. String nextTime = getTime((time + dx) % MOD);
  62. if (match(nextTime, times[i + 1])) {
  63. from[i + 1][(time + dx) % MOD] = true;
  64. }
  65. }
  66. }
  67. }
  68. }
  69. for (int time = 0; time < 24 * 60; ++time) {
  70. if (match(getTime(time), times[n - 1])) {
  71. to[n - 1][time] = true;
  72. }
  73. }
  74. for (int i = n - 1; i > 0; --i) {
  75. for (int time = 0; time < to[i].length; ++time) {
  76. if (to[i][time]) {
  77. for (int dx = min[i - 1]; dx <= max[i - 1]; ++dx) {
  78. String nextTime = getTime((time - dx + MOD) % MOD);
  79. if (match(nextTime, times[i - 1])) {
  80. to[i - 1][(time - dx + MOD) % MOD] = true;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. for (int i = 0; i < n; ++i) {
  87. int count = 0;
  88. int when = 0;
  89. for (int j = 0; j < from[i].length; ++j) {
  90. if (from[i][j] && to[i][j]) {
  91. ++count;
  92. when = j;
  93. }
  94. }
  95. if (count > 1) {
  96. out.println("ambiguous, " + count + " possibilities");
  97. } else {
  98. out.println(getTimeAsString(when));
  99. }
  100. }
  101. out.println();
  102. }
  103. }
  104.  
  105. private String getTimeAsString(int time) {
  106. int hours = time / 60;
  107. int minutes = time % 60;
  108. return hours + ":" + String.format("%02d", minutes);
  109. }
  110.  
  111. private boolean match(String time, String pattern) {
  112. if (pattern.length() != time.length()) {
  113. throw null;
  114. }
  115. for (int i = 0; i < pattern.length(); ++i) {
  116. if (pattern.charAt(i) != '?') {
  117. char c = pattern.charAt(i);
  118. if (c == '|') {
  119. c = '-';
  120. }
  121. if (c != time.charAt(i)) {
  122. return false;
  123. }
  124. }
  125. }
  126. return true;
  127. }
  128.  
  129. private String readTime() throws IOException {
  130. StringBuilder builder = new StringBuilder();
  131. for (int i = 0; i < 28; ++i) {
  132. builder.append(in.next());
  133. }
  134. char[] s = builder.toString().toCharArray();
  135. int[] order = new int[]{1, 5, 6, 13, 17, 18, 25, 2, 7, 8, 14, 19, 20, 26, 3, 9, 10, 15, 21, 22, 27, 4, 11, 12, 16, 23, 24, 28};
  136. builder = new StringBuilder();
  137. for (int x : order) {
  138. builder.append(s[x - 1]);
  139. }
  140. return builder.toString();
  141. }
  142.  
  143. public void run() {
  144. try {
  145. solution();
  146. in.reader.close();
  147. out.close();
  148. } catch (IOException e) {
  149. e.printStackTrace();
  150. System.exit(1);
  151. }
  152. }
  153.  
  154. public static void main(String[] args) {
  155. new Thread(null, new C(), "", 1 << 28).start();
  156. }
  157.  
  158. private class Scanner {
  159. BufferedReader reader;
  160. StringTokenizer tokenizer;
  161.  
  162. public Scanner(Reader reader) {
  163. this.reader = new BufferedReader(reader);
  164. this.tokenizer = new StringTokenizer("");
  165. }
  166.  
  167. public boolean hasNext() throws IOException {
  168. while (!tokenizer.hasMoreTokens()) {
  169. String line = reader.readLine();
  170. if (line == null) {
  171. return false;
  172. }
  173. tokenizer = new StringTokenizer(line);
  174. }
  175. return true;
  176. }
  177.  
  178. public String next() throws IOException {
  179. hasNext();
  180. return tokenizer.nextToken();
  181. }
  182.  
  183. public int nextInt() throws IOException {
  184. return Integer.parseInt(next());
  185. }
  186. }
  187.  
  188. Scanner in = new Scanner(new InputStreamReader(System.in));
  189. PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement