Cod sursa(job #2521495)

Utilizator robertdanRobert Dan robertdan Data 10 ianuarie 2020 23:06:14
Problema Lowest Common Ancestor Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 4.12 kb
import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    interface Solver {
        void solve(BufferedReader br, PrintWriter pw) throws IOException;
    }
    static class AppConfig {
        public static final String ROOT_DIR = "d:\\Dev\\Local\\algorithms\\";
        public static final String SEPARATOR = "\\";
        public static final String DATA_DIR = "data";
    }
    static class UsacoAssignSolver implements Solver {
        int n;
        int[] colours;
        List<List<Integer>> same;
        List<List<Integer>> different;

        @Override
        public void solve(BufferedReader br, PrintWriter pw) throws IOException {
            same = new ArrayList<>();
            different = new ArrayList<>();

            String[] splits = br.readLine().split(" ");
            n = Integer.parseInt(splits[0]);

            colours = new int[n];

            int k = Integer.parseInt(splits[1]);
            for (int i = 0; i < k; i++) {
                splits = br.readLine().split(" ");
                char type = splits[0].charAt(0);
                Integer cow1 = Integer.parseInt(splits[1]);
                Integer cow2 = Integer.parseInt(splits[2]);
                if (type == 'S') {
                    same.add(Arrays.asList(cow1, cow2));
                } else {
                    different.add(Arrays.asList(cow1, cow2));
                }
            }

            int nSol = generateSolutions();
            pw.println(3 * nSol);
        }

        private int generateSolutions() {
            int ans = 0;
            colours[0] = 0;
            int pow3 = 1;
            for (int i = 1; i < n; i++) {
                pow3 *= 3;
            }
            for (int i = 0; i < pow3; i++) {
                populateColours(i);
                if (checkColours()) {
                    ans++;
                }
            }
            return ans;
        }

        private void populateColours(int code) {
            for (int i = n - 1; i >= 1; i--) {
                colours[i] = code % 3;
                code = code / 3;
            }
        }

        private Boolean checkColours() {
            for (List<Integer> pair : same) {
                int cow1 = pair.get(0);
                int cow2 = pair.get(1);
                if (colours[cow1 - 1] != colours[cow2 - 1]) {
                    return false;
                }
            }
            for (List<Integer> pair : different) {
                int cow1 = pair.get(0);
                int cow2 = pair.get(1);
                if (colours[cow1 - 1] == colours[cow2 - 1]) {
                    return false;
                }
            }
            return true;
        }
    }

    private Solver solver;
    private BufferedReader br;
    private PrintWriter pw;

    private void setupStandardIO() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    }

    private void setupIOFromFile(String filePath) throws IOException {
        br = new BufferedReader(new FileReader(new File(filePath + ".in")));
        pw = new PrintWriter(new BufferedWriter(new FileWriter(new File(filePath + ".out"))));
    }

    Main(Solver solver, String fileName) throws IOException {
        this.solver = solver;
        if (fileName == null) {
            setupStandardIO();
        } else if(fileName.startsWith("USACO_")) {
            setupIOFromFile(fileName.substring(6));
        } else {
            setupIOFromFile(AppConfig.ROOT_DIR + AppConfig.SEPARATOR + AppConfig.DATA_DIR + AppConfig.SEPARATOR + fileName);
        }
    }

    public static void main(String[] args) throws IOException {
        Main app = new Main(new UsacoAssignSolver(), "USACO_assign");
        app.runSolver();
    }

    private void runSolver() throws IOException {
        solver.solve(br, pw);
        br.close();
        pw.close();
    }
}