Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.35 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.ArrayList;
  5. import java.util.Scanner;
  6.  
  7. public class Main {
  8.     static class Task {
  9.         public final static String INPUT_FILE = "in";
  10.         public final static String OUTPUT_FILE = "out";
  11.  
  12.         private final static int MOD = 1000000007;
  13.  
  14.         int n;
  15.         char[] v;
  16.  
  17.         private void readInput() {
  18.             try {
  19.                 Scanner sc = new Scanner(new File(INPUT_FILE));
  20.                 n = sc.nextInt();
  21.                 String s = sc.next().trim();
  22.                 s = " " + s;
  23.                 v = s.toCharArray();
  24.                 sc.close();
  25.             } catch (IOException e) {
  26.                 throw new RuntimeException(e);
  27.             }
  28.         }
  29.  
  30.         private void writeOutput(int result) {
  31.             try {
  32.                 PrintWriter pw = new PrintWriter(new File(OUTPUT_FILE));
  33.                 pw.printf("%d\n", result);
  34.                 pw.close();
  35.             } catch (IOException e) {
  36.                 throw new RuntimeException(e);
  37.             }
  38.         }
  39.  
  40.         private Boolean OperandValue(char x) {
  41.             if (x == 'T') {
  42.                 return true;
  43.             }
  44.             return false;
  45.         }
  46.  
  47.         private Boolean isOperator(char x) {
  48.             if (x == '&' || x == '|' || x == '^')
  49.                 return true;
  50.             return false;
  51.         }
  52.  
  53.         private int getResult() {
  54.             // TODO: Calculati numarul de moduri in care se pot aseza
  55.             // parantezele astfel incat rezultatul expresiei sa fie TRUE.
  56.             // Numarul de moduri se va calcula modulo MOD (1000000007).
  57.             int nrOperands = n / 2 + 1;
  58.             int[][] dpTrue = new int[nrOperands + 1][nrOperands + 1];
  59.             int[][] dpFalse = new int[nrOperands + 1][nrOperands + 1];
  60.  
  61.             for (int i = 1, op = 1; i <= nrOperands; i++, op += 2) {
  62.                 if (OperandValue(v[op])) {
  63.                     dpTrue[i][i] = 1;
  64.                     dpFalse[i][i] = 0;
  65.                 } else {
  66.                     dpTrue[i][i] = 0;
  67.                     dpFalse[i][i] = 1;
  68.                 }
  69.             }
  70.  
  71.             // Creez lista de operatori
  72.  
  73.             ArrayList<Character> operators = new ArrayList<Character>();
  74.             for (int i = 0; i < v.length; i++) {
  75.                 if (isOperator(v[i])) {
  76.                     operators.add(v[i]);
  77.                 }
  78.             }
  79.  
  80.             for (int len = 2; len <= nrOperands; len++) {
  81.                 for (int i = 1; i + len - 1 <= nrOperands; i++) {
  82.                     int j = i + len - 1;
  83.                     for (int k = i; k < j; k++) {
  84.                         int tot1 = (dpTrue[i][k] % MOD + dpFalse[i][k] % MOD) % MOD;
  85.                         int tot2 = (dpTrue[k + 1][j] % MOD + dpFalse[k + 1][j] % MOD) % MOD;
  86.  
  87.                         if (operators.get(k - 1) == '&') {
  88.                             dpTrue[i][j] = (int) ((dpTrue[i][j] + 1L*dpTrue[i][k] % MOD * dpTrue[k + 1][j] % MOD) % MOD);
  89.                             dpFalse[i][j] = (int) ((dpFalse[i][j] + (1L*tot1 * tot2) % MOD - (1L*dpTrue[i][k] * dpTrue[k + 1][j]) % MOD + MOD)
  90.                                     % MOD);
  91.                         }
  92.  
  93.                         if (operators.get(k - 1) == '|') {
  94.                             dpTrue[i][j] = (int) ((dpTrue[i][j] + (1L*tot1 * tot2) % MOD - (1L*dpFalse[i][k] * dpFalse[k + 1][j]) % MOD + MOD)
  95.                                     % MOD);
  96.                             dpFalse[i][j] = (int) ((dpFalse[i][j] + 1L*dpFalse[i][k] % MOD * dpFalse[k + 1][j] % MOD) % MOD);
  97.                         }
  98.  
  99.                         if (operators.get(k - 1) == '^') {
  100.                             dpTrue[i][j] = (int) ((dpTrue[i][j] + (1L*dpTrue[i][k] * dpFalse[k + 1][j]) % MOD
  101.                                     + (1L*dpFalse[i][k] * dpTrue[k + 1][j]) % MOD) % MOD);
  102.                             dpFalse[i][j] = (int) ((dpFalse[i][j] + (1L*dpTrue[i][k] * dpTrue[k + 1][j]) % MOD
  103.                                     + (1L*dpFalse[i][k] * dpFalse[k + 1][j]) % MOD) % MOD);
  104.                         }
  105.  
  106.                     }
  107.                 }
  108.             }
  109.  
  110.             return dpTrue[1][nrOperands];
  111.         }
  112.  
  113.         public void solve() {
  114.             readInput();
  115.             writeOutput(getResult());
  116.         }
  117.     }
  118.  
  119.     public static void main(String[] args) {
  120.         new Task().solve();
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement