#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; string s; int k; int e[3][3] = { {1,2,1},{2,0,0},{1,0,0} }; int a[3][3] = { {0,1,2},{1,1,2},{2,2,2} }; vector> mem(200020); long long mod = 998244353; tuple expression(int i) { if (mem[i] != make_tuple(-1, -1, -1)) { return mem[i]; } int i2 = i; if (s[i] == 'm') { i++; tuple ans = { 0, 0, 0 }; int ans1[3] = { 0,0,0 }; int i1 = i; if (s[i1] == 'e' || s[i1] == '?') { tuple t = expression(i + 3); if (s[i + 3] == 'm') { i += 7; int now = 1; while (now != 0) { if (s[i] == '(') { now++; } if (s[i] == ')') { now--; } i++; } } else { i += 2; } tuple t1 = expression(i + 1); int u[3] = { get<0>(t),get<1>(t),get<2>(t) }; int u1[3] = { get<0>(t1),get<1>(t1),get<2>(t1) }; for (int k = 0; k < 3; k++) { for (int j = 0; j < 3; j++) { ans1[e[k][j]] += u[k] * u1[j] % mod; ans1[e[k][j]] %= mod; } } } if (s[i1] == 'a' || s[i1] == '?') { tuple t = expression(i1 + 3); if (s[i1 + 3] == 'm') { i1 += 7; int now = 1; while (now != 0) { if (s[i1] == '(') { now++; } if (s[i1] == ')') { now--; } i1++; } } else { i1 += 2; } tuple t1 = expression(i1 + 1); int u[3] = { get<0>(t),get<1>(t),get<2>(t) }; int u1[3] = { get<0>(t1),get<1>(t1),get<2>(t1) }; for (int k = 0; k < 3; k++) { for (int j = 0; j < 3; j++) { ans1[a[k][j]] += u[k] * u1[j] % mod; ans1[a[k][j]] %= mod; } } } ans = { ans1[0],ans1[1],ans1[2] }; mem[i2] = ans; return ans; } else { if (s[i] == '0') { mem[i2] = { 1,0,0 }; return { 1,0,0 }; } else if (s[i] == '1') { mem[i2] = { 0,1,0 }; return { 0,1,0 }; } else if (s[i] == '2') { mem[i2] = { 0,0,1 }; return { 0,0,1 }; } else { mem[i2] = { 1,1,1 }; return { 1,1,1 }; } } } int main() { cin >> s >> k; for (int i = 0; i < s.size(); i++) { mem[i] = { -1,-1,-1 }; } tuple ans1 = expression(0); int ans[3] = { get<0>(ans1),get<1>(ans1),get<2>(ans1) }; cout << ans[k] << endl; }