Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.*;
- import java.util.*;
- public class C implements Runnable {
- String[] digits = new String[10];
- String EMPTY = ".......";
- {
- digits[0] = "---.---";
- digits[1] = "..-..-.";
- digits[2] = "-.---.-";
- digits[3] = "-.--.--";
- digits[4] = ".---.-.";
- digits[5] = "--.-.--";
- digits[6] = "--.----";
- digits[7] = "-.-..-.";
- digits[8] = "-------";
- digits[9] = "----.--";
- }
- private String getTime(int time) {
- int hours = time / 60;
- int minutes = time % 60;
- String res = "";
- if (hours < 10) {
- res = EMPTY + digits[hours % 10];
- } else {
- res = digits[hours / 10] + digits[hours % 10];
- }
- res += digits[minutes / 10] + digits[minutes % 10];
- return res;
- }
- private void solution() throws IOException {
- while (true) {
- int n = in.nextInt();
- if (n == 0) {
- break;
- }
- String[] times = new String[n];
- int[] min = new int[n - 1];
- int[] max = new int[n - 1];
- for (int i = 0; i < n; ++i) {
- times[i] = readTime();
- if (i + 1 < n) {
- min[i] = in.nextInt();
- max[i] = in.nextInt();
- }
- }
- boolean[][] from = new boolean[n][24 * 60];
- boolean[][] to = new boolean[n][24 * 60];
- for (int time = 0; time < 24 * 60; ++time) {
- if (match(getTime(time), times[0])) {
- from[0][time] = true;
- }
- }
- int MOD = 24 * 60;
- for (int i = 0; i < n - 1; ++i) {
- for (int time = 0; time < from[i].length; ++time) {
- if (from[i][time]) {
- for (int dx = min[i]; dx <= max[i]; ++dx) {
- String nextTime = getTime((time + dx) % MOD);
- if (match(nextTime, times[i + 1])) {
- from[i + 1][(time + dx) % MOD] = true;
- }
- }
- }
- }
- }
- for (int time = 0; time < 24 * 60; ++time) {
- if (match(getTime(time), times[n - 1])) {
- to[n - 1][time] = true;
- }
- }
- for (int i = n - 1; i > 0; --i) {
- for (int time = 0; time < to[i].length; ++time) {
- if (to[i][time]) {
- for (int dx = min[i - 1]; dx <= max[i - 1]; ++dx) {
- String nextTime = getTime((time - dx + MOD) % MOD);
- if (match(nextTime, times[i - 1])) {
- to[i - 1][(time - dx + MOD) % MOD] = true;
- }
- }
- }
- }
- }
- for (int i = 0; i < n; ++i) {
- int count = 0;
- int when = 0;
- for (int j = 0; j < from[i].length; ++j) {
- if (from[i][j] && to[i][j]) {
- ++count;
- when = j;
- }
- }
- if (count > 1) {
- out.println("ambiguous, " + count + " possibilities");
- } else {
- out.println(getTimeAsString(when));
- }
- }
- out.println();
- }
- }
- private String getTimeAsString(int time) {
- int hours = time / 60;
- int minutes = time % 60;
- return hours + ":" + String.format("%02d", minutes);
- }
- private boolean match(String time, String pattern) {
- if (pattern.length() != time.length()) {
- throw null;
- }
- for (int i = 0; i < pattern.length(); ++i) {
- if (pattern.charAt(i) != '?') {
- char c = pattern.charAt(i);
- if (c == '|') {
- c = '-';
- }
- if (c != time.charAt(i)) {
- return false;
- }
- }
- }
- return true;
- }
- private String readTime() throws IOException {
- StringBuilder builder = new StringBuilder();
- for (int i = 0; i < 28; ++i) {
- builder.append(in.next());
- }
- char[] s = builder.toString().toCharArray();
- 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};
- builder = new StringBuilder();
- for (int x : order) {
- builder.append(s[x - 1]);
- }
- return builder.toString();
- }
- public void run() {
- try {
- solution();
- in.reader.close();
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- System.exit(1);
- }
- }
- public static void main(String[] args) {
- new Thread(null, new C(), "", 1 << 28).start();
- }
- private class Scanner {
- BufferedReader reader;
- StringTokenizer tokenizer;
- public Scanner(Reader reader) {
- this.reader = new BufferedReader(reader);
- this.tokenizer = new StringTokenizer("");
- }
- public boolean hasNext() throws IOException {
- while (!tokenizer.hasMoreTokens()) {
- String line = reader.readLine();
- if (line == null) {
- return false;
- }
- tokenizer = new StringTokenizer(line);
- }
- return true;
- }
- public String next() throws IOException {
- hasNext();
- return tokenizer.nextToken();
- }
- public int nextInt() throws IOException {
- return Integer.parseInt(next());
- }
- }
- Scanner in = new Scanner(new InputStreamReader(System.in));
- PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement