Advertisement
Guest User

Untitled

a guest
Mar 28th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef pair<string, bool> sb;
  6.  
  7. int countWays(string expr, bool result, map<sb, int> &memo) {
  8.     if(expr.size() == 0) {
  9.         return 0;
  10.     }
  11.     if(expr.size() == 1) {
  12.         return (expr[0] - '0') == result;
  13.     }
  14.  
  15.     if(memo.find(sb(expr, result)) != memo.end()) {
  16.         return memo[sb(expr, result)];
  17.     }
  18.  
  19.     int ways = 0;
  20.  
  21.     for(int i = 1; i < expr.size(d); i += 2) {
  22.         string left = expr.substr(0, i);
  23.         string right = expr.substr(i + 1, string::npos);
  24.  
  25.         int leftTrue = countWays(left, true, memo);
  26.         int leftFalse = countWays(left, false, memo);
  27.         int rightTrue = countWays(right, true, memo);
  28.         int rightFalse = countWays(right, false, memo);
  29.  
  30.         int totalWays = (leftTrue + leftFalse) * (rightFalse + rightTrue);
  31.  
  32.         int totalTrue = 0;
  33.  
  34.         switch(expr[i]) {
  35.             case '^':
  36.                 totalTrue += leftTrue*rightFalse + leftFalse*rightTrue;
  37.                 break;
  38.             case '|':
  39.                 totalTrue += leftTrue*rightFalse + leftTrue*rightTrue + leftFalse*rightTrue;
  40.                 break;
  41.             case '&':
  42.                 totalTrue += leftTrue*rightTrue;
  43.                 break;
  44.         }
  45.  
  46.         if(result) {
  47.             ways += totalTrue;
  48.         } else {
  49.             ways += totalWays - totalTrue;
  50.         }
  51.     }
  52.  
  53.     return memo[sb(expr, result)] = ways;
  54. }
  55.  
  56. int countWays(string expr, bool result) {
  57.     map<sb, int> memo;
  58.     return countWays(expr, result, memo);
  59. }
  60.  
  61. void test0() {
  62.     string expr = "1^0|0|1";
  63.     bool result = false;
  64.  
  65.     int test = countWays(expr, result);
  66.     int control = 2;
  67.  
  68.     assert(test == control);
  69. }
  70.  
  71. void test1() {
  72.     string expr = "0&0&0&1^1|0";
  73.     bool result = true;
  74.  
  75.     int test = countWays(expr, result);
  76.     int control = 10;
  77.  
  78.     assert(test == control);
  79. }
  80.  
  81. int main() {
  82.     test0();
  83.     test1();
  84.  
  85.     cout << "success" << endl;
  86.  
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement