#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;
    }
}

Measured memory_bytes: 46220