Problem p01983 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;

int bin(int x, int y, char e) {
  if (e == '+') {
    return x | y;
  } else if (e == '*') {
    return x & y;
  } else {
    return x ^ y;
  }
}
int compute(const string &str, int a, int b, int c, int d) {

  stack<int> s;
  stack<char> op;
  char e;
  int x, y, z;
  for (int i = 0; i < str.size(); i++) {
    if (str[i] == 'a') {
      s.push(a);
    } else if (str[i] == 'b') {
      s.push(b);
    } else if (str[i] == 'c') {
      s.push(c);
    } else if (str[i] == 'd') {
      s.push(d);
    }

    if (str[i] == '+') {
      op.push('+');
    } else if (str[i] == '*') {
      op.push('*');
    } else if (str[i] == '^') {
      op.push('^');
    }

    if (str[i] == ']') {
      e = op.top();
      op.pop();
      x = s.top();
      s.pop();
      y = s.top();
      s.pop();
      s.push(bin(x, y, e));
    }
  }
  return s.top();
}

int main() {
  int n;
  string str;
  int cnt = 0;

  while (1) {
    cnt = 0;
    cin >> str;
    if (str == ".")
      break;
    cin >> n;

    int key = compute(str, n / 1000, n / 100 % 10, n / 10 % 10, n % 10);

    for (int a = 0; a < 10; a++) {
      for (int b = 0; b < 10; b++) {
        for (int c = 0; c < 10; c++) {
          for (int d = 0; d < 10; d++) {
            if (compute(str, a, b, c, d) == key) {
              cnt++;
            }
          } // d
        }   // c
      }     // b
    }       // a
    cout << key << " " << cnt << endl;

  } // while

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

int bin(int x, int y, char e) {
  if (e == '+') {
    return x | y;
  } else if (e == '*') {
    return x & y;
  } else {
    return x ^ y;
  }
}
int main() {
  int n;
  string str;
  stack<int> s;
  stack<char> op;
  char e;
  int x, y, z;
  int cnt = 0;

  while (1) {
    cin >> str;
    if (str == "-")
      break;
    cin >> n;

    int a, b, c, d;
    a = n / 1000;
    b = (n % 1000) / 100;
    c = (n % 100) / 10;
    d = n % 10;

    for (int i = 0; i < str.size(); i++) {
      if (str[i] == 'a') {
        s.push(a);
      } else if (str[i] == 'b') {
        s.push(b);
      } else if (str[i] == 'c') {
        s.push(c);
      } else if (str[i] == 'd') {
        s.push(d);
      }

      if (str[i] == '+') {
        op.push('+');
      } else if (str[i] == '*') {
        op.push('*');
      } else if (str[i] == '^') {
        op.push('^');
      }

      if (str[i] == ']') {
        e = op.top();
        op.pop();
        x = s.top();
        s.pop();
        y = s.top();
        s.pop();
        s.push(bin(x, y, e));
      }
    }
    cout << s.top() << " ";
    int z = s.top();

    for (int a = 0; a < 10; a++) {
      for (int b = 0; b < 10; b++) {
        for (int c = 0; c < 10; c++) {
          for (int d = 0; d < 10; d++) {
            for (int i = 0; i < str.size(); i++) {
              if (str[i] == 'a') {
                s.push(a);
              } else if (str[i] == 'b') {
                s.push(b);
              } else if (str[i] == 'c') {
                s.push(c);
              } else if (str[i] == 'd') {
                s.push(d);
              }

              if (str[i] == '+') {
                op.push('+');
              } else if (str[i] == '*') {
                op.push('*');
              } else if (str[i] == '^') {
                op.push('^');
              }

              if (str[i] == ']') {
                e = op.top();
                op.pop();
                x = s.top();
                s.pop();
                y = s.top();
                s.pop();
                s.push(bin(x, y, e));
              }
            }
            if (z == s.top())
              cnt++;
          }
        }
      }
    }
    cout << cnt << endl;
  }
  return 0;
}