Problem p01105 (C++) — buggy submission, verdict: Memory Limit Exceeded

#include <functional>
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

struct D {
  string s;
  int v = -1;
  D(const string &ss, int vv) : s{ss}, v{vv} {}
};

int main() {
  // ????????????????????¨??????????????????????????¨???????????????
  unordered_map<int, vector<int>> m;

  // ???????????¨??¨????????????????????????????????????
  unordered_map<int, int> d;

  // ??????1
  m[1].push_back(0b0000'0000'0000'0000);
  m[1].push_back(0b1111'1111'1111'1111);
  m[1].push_back(0b0000'0000'1111'1111);
  m[1].push_back(0b0000'1111'0000'1111);
  m[1].push_back(0b0011'0011'0011'0011);
  m[1].push_back(0b0101'0101'0101'0101);

  for (auto &&j : m[1]) {
    d[j] = 1;
  }

  // ??????2??\\???
  for (int i = 2; i <= 16; ++i) {
    // 1????°??????????????????? "-" ????????????????????????????????????
    for (auto &&j : m[i - 1]) {
      auto v = j ^ 0b1111'1111'1111'1111;
      if (d.find(v) == end(d)) {
        d[v] = i;
      }
      m[i].push_back(v);
    }

    // ?????£?????¨???????????§3????????????
    int j = i - 3;
    // ?¢??????????????°?????????¨???2????????????
    if (j < 2) {
      continue;
    }
    // 2???????°?????????????????????????????????? j
    // ???????????????????????????????????????????????????????????????????????????
    for (int k = 1; k < j; ++k) {
      for (auto &&l : m[k]) {
        for (auto &&r : m[j - k]) {
          {
            auto v = l ^ r;
            if (d.find(v) == end(d)) {
              d[v] = i;
            }
            m[i].push_back(v);
          }
          {
            auto v = l & r;
            if (d.find(v) == end(d)) {
              d[v] = i;
            }
            m[i].push_back(v);
          }
        }
      }
    }
  }

  // ??????????????????????????????????????¨?????????
  auto parse = [](const string &ss) {
    int i = 0;
    function<int(const string &)> p = [&i, &p](const string &s) {
      if (s[i] == '0') {
        ++i;
        return 0b0000'0000'0000'0000;
      } else if (s[i] == '1') {
        ++i;
        return 0b1111'1111'1111'1111;
      } else if (s[i] == 'a') {
        ++i;
        return 0b0000'0000'1111'1111;
      } else if (s[i] == 'b') {
        ++i;
        return 0b0000'1111'0000'1111;
      } else if (s[i] == 'c') {
        ++i;
        return 0b0011'0011'0011'0011;
      } else if (s[i] == 'd') {
        ++i;
        return 0b0101'0101'0101'0101;
      } else if (s[i] == '-') {
        ++i;
        return p(s) ^ 0b1111'1111'1111'1111;
      } else {
        ++i;
        auto l = p(s);
        auto op = s[i];
        ++i;
        auto r = p(s);
        ++i;
        if (op == '^') {
          return l ^ r;
        } else {
          return l & r;
        }
      }
    };
    return p(ss);
  };

  while (true) {
    string s;
    cin >> s;
    if (s == ".") {
      return 0;
    }
    cout << d[parse(s)] << endl;
  }
}

Error: MLE

Fixed submission:

#include <functional>
#include <iostream>
#include <sstream>
#include <string>
#include <unordered_map>
#include <vector>

using namespace std;

struct D {
  string s;
  int v = -1;
  D(const string &ss, int vv) : s{ss}, v{vv} {}
};

int main() {
  // ????????????????????¨???????????????????????????????????????
  unordered_map<int, vector<D>> m;

  // ???????????¨??¨????????????????????????????????????
  unordered_map<int, int> d;

  // ??????1
  m[1].emplace_back("0", 0b0000'0000'0000'0000);
  m[1].emplace_back("1", 0b1111'1111'1111'1111);
  m[1].emplace_back("a", 0b0000'0000'1111'1111);
  m[1].emplace_back("b", 0b0000'1111'0000'1111);
  m[1].emplace_back("c", 0b0011'0011'0011'0011);
  m[1].emplace_back("d", 0b0101'0101'0101'0101);

  for (auto &&j : m[1]) {
    d[j.v] = 1;
  }

  // ??????2??\\???
  for (int i = 2; i <= 16; ++i) {
    // 1????°??????????????????? "-" ????????????????????????????????????
    for (auto &&j : m[i - 1]) {
      auto v = j.v ^ 0b1111'1111'1111'1111;
      if (d.find(v) == end(d)) {
        d[v] = i;
      }
      m[i].emplace_back("-" + j.s, v);
    }

    // ?????£?????¨???????????§3????????????
    int j = i - 3;
    // ?¢??????????????°?????????¨???2????????????
    if (j < 2) {
      continue;
    }
    // 2???????°?????????????????????????????????? j
    // ???????????????????????????????????????????????????????????????????????????
    for (int k = 1; k < j; ++k) {
      for (auto &&l : m[k]) {
        for (auto &&r : m[j - k]) {
          {
            stringstream ss;
            ss << "(" << l.s << "^" << r.s << ")";
            auto v = l.v ^ r.v;
            if (d.find(v) == end(d)) {
              d[v] = i;
            }
            m[i].emplace_back(ss.str(), v);
          }
          {
            stringstream ss;
            ss << "(" << l.s << "*" << r.s << ")";
            auto v = l.v & r.v;
            if (d.find(v) == end(d)) {
              d[v] = i;
            }
            m[i].emplace_back(ss.str(), v);
          }
        }
      }
    }
  }

  // ??????????????????????????????????????¨?????????
  auto parse = [](const string &ss) {
    int i = 0;
    function<int(const string &)> p = [&i, &p](const string &s) {
      if (s[i] == '0') {
        ++i;
        return 0b0000'0000'0000'0000;
      } else if (s[i] == '1') {
        ++i;
        return 0b1111'1111'1111'1111;
      } else if (s[i] == 'a') {
        ++i;
        return 0b0000'0000'1111'1111;
      } else if (s[i] == 'b') {
        ++i;
        return 0b0000'1111'0000'1111;
      } else if (s[i] == 'c') {
        ++i;
        return 0b0011'0011'0011'0011;
      } else if (s[i] == 'd') {
        ++i;
        return 0b0101'0101'0101'0101;
      } else if (s[i] == '-') {
        ++i;
        return p(s) ^ 0b1111'1111'1111'1111;
      } else {
        ++i;
        auto l = p(s);
        auto op = s[i];
        ++i;
        auto r = p(s);
        ++i;
        if (op == '^') {
          return l ^ r;
        } else {
          return l & r;
        }
      }
    };
    return p(ss);
  };

  while (true) {
    string s;
    cin >> s;
    if (s == ".") {
      return 0;
    }
    cout << d[parse(s)] << endl;
  }
}