Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. const int kMod = 1e9 + 7;
  9.  
  10. class Task {
  11.  public:
  12.     void solve() {
  13.         read_input();
  14.         print_output(get_result());
  15.     }
  16.  
  17.  private:
  18.     int n;
  19.     string expr;
  20.  
  21.     void read_input() {
  22.         ifstream fin("in");
  23.         fin >> n >> expr;
  24.         expr = " " + expr; // adaugare caracter fictiv - indexare de la 1
  25.         fin.close();
  26.     }
  27.  
  28.     int get_result() {
  29.         /*
  30.         Calculati numarul de parantezari ale expresiei date astfel incat
  31.         rezultatul sa dea true si returnati restul impartirii numarului
  32.         la 10^9 + 7.
  33.         */
  34.  
  35.         int DP_F[1000][1000], DP_T[1000][1000];
  36.         int sym = 0;
  37.         int op = 0;
  38.         char symbols[n];
  39.         char operators[n];
  40.  
  41.         for (int i = 1; i <= n; i++){
  42.             if (expr.at(i) == 'T' || expr.at(i) == 'F') {
  43.                 symbols[sym++] = expr.at(i);
  44.             } else {
  45.                 operators[op++] = expr.at(i);
  46.             }
  47.         }
  48.  
  49.         for (int i = 0; i < sym; i++) {
  50.             if (symbols[i] == 'T') {
  51.                 DP_T[i][i] = 1;
  52.                 DP_F[i][i] = 0;
  53.             } else {
  54.                 DP_T[i][i] = 0;
  55.                 DP_F[i][i] = 1;
  56.             }
  57.         }
  58.  
  59.         for (int i = 1; i < sym; i++) {
  60.             for (int j = 0; j < sym - i; j++) {
  61.                 int p = j + i;
  62.  
  63.                 DP_T[j][p] = 0;
  64.                 DP_F[j][p] = 0;
  65.  
  66.                 for (int k = j; k < p; k++) {
  67.                     int sum1 = (DP_T[j][k] + DP_F[j][k]) % kMod;
  68.                     int sum2 = (DP_T[k+1][p] + DP_F[k+1][p]) % kMod;
  69.  
  70.                     if (operators[k] == '^') {
  71.                         DP_T[j][p] = (1LL * DP_F[j][k] * DP_T[k+1][p] + 1LL * DP_T[j][k] * DP_F[k+1][p] +
  72.                                      DP_T[j][p]) % kMod;
  73.                         DP_F[j][p] = (1LL * DP_T[j][k] * DP_T[k+1][p] + 1LL * DP_F[j][k] * DP_F[k+1][p] +
  74.                                     DP_F[j][p]) % kMod;
  75.                     }
  76.  
  77.                     if (operators[k] == '|') {
  78.                         DP_T[j][p] = (1LL * sum1 * sum2 - 1LL * DP_F[j][k] * DP_F[k+1][p] +
  79.                                 DP_T[j][p]) % kMod;
  80.                         if (DP_T[j][p] < 0)
  81.                             DP_T[j][p] += kMod; // this must be done as C++ doesn't handle well
  82.                                                 // negative values with modulo
  83.                         DP_F[j][p] = (1LL * DP_F[j][k] * DP_F[k+1][p] + DP_F[j][p]) % kMod;
  84.                     }
  85.                    
  86.                     if (operators[k] == '&') {
  87.                         DP_T[j][p] = (1LL * DP_T[j][k] * DP_T[k+1][p] + DP_T[j][p]) % kMod;
  88.                         DP_F[j][p] = (1LL * sum1 * sum2 - 1LL * DP_T[j][k] * DP_T[k+1][p] +
  89.                                      DP_F[j][p]) % kMod;
  90.                         if (DP_F[j][p] < 0)
  91.                             DP_F[j][p] += kMod;
  92.                     }
  93.                 }
  94.             }
  95.         }
  96.  
  97.         return DP_T[0][sym - 1];
  98.     }
  99.  
  100.     void print_output(int result) {
  101.         ofstream fout("out");
  102.         fout << result << '\n';
  103.         fout.close();
  104.     }
  105. };
  106.  
  107. int main() {
  108.     Task task;
  109.     task.solve();
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement