#include #include using namespace std; using ll = long long; using mint = atcoder::modint998244353; vector> dp(200001, array({-1, -1, -1})); vector T; vector> g(200001); string s; int all, cnt = 1, i; //type0:m?x //type1:max //type2:mex //type3:? //type4:0 //type5:1 //type6:2 void dfs(int v){ i++; vector children; while(s[i]!=')'){ if(s[i]=='m'){ i++; if(s[i]=='?')T.push_back(0),g[v].push_back(cnt),dfs(cnt++); else if(s[i]=='a')T.push_back(1),g[v].push_back(cnt),dfs(cnt++); else if(s[i]=='e')T.push_back(2),g[v].push_back(cnt),dfs(cnt++); }else{ if(s[i]=='?')T.push_back(3),g[v].push_back(cnt++); else if(s[i]=='0')T.push_back(4),g[v].push_back(cnt++); else if(s[i]=='1')T.push_back(5),g[v].push_back(cnt++); else if(s[i]=='2')T.push_back(6),g[v].push_back(cnt++); } i++; } } ll rec(int v,int value){ if(T[v] >= 3){ if(T[v] == 3) return 1; else return (value == T[v] - 4); } if(dp[v][value] != -1) return dp[v][value]; mint maxv, mexv, l = 1, r = 1, l2; //max処理 if(T[v] == 0 || T[v] == 1){ for(auto u : g[v]){ if(value == 0)r *= rec(u,0); else if(value == 1)r *= rec(u,1) + rec(u,0), l *= rec(u,0); else if(value == 2)r *= rec(u,2) + rec(u,1) + rec(u,0), l *= rec(u,1) + rec(u,0); } if(value == 0) l = 0; maxv = r - l; } l = 1, r = 1, l2 = 1; if(T[v] == 0 || T[v] == 2){ for(auto u : g[v]){ if(value == 0)r *= rec(u,1) + rec(u,2); else if(value == 1)r *= rec(u,0) + rec(u,2),l *= rec(u,2); else if(value == 2)r *= rec(u,0) + rec(u,1),l *= rec(u,0), l2 *= rec(u,1); } if(value == 0) l = 0; if(value <= 1) l2 = 0; mexv = r - l - l2; } return dp[v][value] = (maxv + mexv).val(); } int main(){ cin >> s >> all; if(s.size() == 1){ if(s[0] == '?' || s[0] - '0' == all) cout << "1\n"; else cout << "0\n"; return 0; } if(s[1] == '?') T.push_back(0); if(s[1] == 'a') T.push_back(1); if(s[1] == 'e') T.push_back(2); i = 1; dfs(0); cout << rec(0, all) << '\n'; }