#include using namespace std; constexpr int mod = 998244353; int c[200005]; vector ki[200005]; long long dp[200005][5]; int mex(int a,int b) { if(a != 0 && b != 0) { return 0; } if(a != 1 && b != 1) { return 1; } return 2; } void dfs(int n,int p) { int a = -1,b = -1; for(int i:ki[n]) { if(i == p) { continue; } dfs(i,n); if(a == -1) { a = i; } else { b = i; } } if(ki[n].size() == 1) { if(c[n] == 3) { dp[n][0] = dp[n][1] = dp[n][2] = 1; } else { dp[n][c[n]] = 1; } } else { if(c[n] == 4 || c[n] == 6) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { dp[n][max(i,j)] += dp[a][i]*dp[b][j]%mod; dp[n][max(i,j)] %= mod; } } } if(c[n] == 5 || c[n] == 6) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { dp[n][mex(i,j)] += dp[a][i]*dp[b][j]%mod; dp[n][mex(i,j)] %= mod; } } } } } int main() { string S; int K; cin >> S >> K; if(S.size() == 1) { if(S[0]-'0' == K || S[0] == '?') { cout << 1 << endl; } else { cout << 0 << endl; } return 0; } stackst; for(int i = 0; i < S.size(); i++) { if(S[i] == 'm') { if(!st.empty()) { ki[i].push_back(st.top()); ki[st.top()].push_back(i); } st.push(i); if(S[i+1] == '?') { c[i] = 6; } if(S[i+1] == 'a') { c[i] = 4; } if(S[i+1] == 'e') { c[i] = 5; } i += 2; } if(S[i] == ')') { st.pop(); } if(S[i] == '?' || (S[i] >= '0' && S[i] <= '2')) { ki[st.top()].push_back(i); ki[i].push_back(st.top()); if(S[i] == '?') { c[i] = 3; } else { c[i] = S[i]-'0'; } } } dfs(0,-1); cout << dp[0][K] << endl; }