#include using namespace std; #include using namespace atcoder; using ll=long long; using Graph=vector>; #define MAX 2000005 //#define MOD 1000000007 #define MOD 998244353 #define INF 1000000000 //#define INF 1000000000000000000 int mex(int a,int b){ int ret=0; while(ret==a||ret==b){ ++ret; } return ret; } vector dfs(string &S,int &i){ if(S[i]=='0'){ ++i; return {1,0,0}; }else if(S[i]=='1'){ ++i; return {0,1,0}; }else if(S[i]=='2'){ ++i; return {0,0,1}; }else if(S[i]=='?'){ ++i; return {1,1,1}; } char c=S[i+1]; i+=4; vector a=dfs(S,i); assert(S[i]==','); ++i; vector b=dfs(S,i); ++i; vector ret(3,0); for(int j=0;j<3;j++){ for(int k=0;k<3;k++){ if(c=='a'||c=='?'){ ret[max(j,k)]+=a[j]*b[k]; ret[max(j,k)]%=MOD; } if(c=='e'||c=='?'){ ret[mex(j,k)]+=a[j]*b[k]; ret[mex(j,k)]%=MOD; } } } return ret; } int main(){ string S; int K; cin>>S>>K; int N=S.size(); int i=0; vector ans=dfs(S,i); cout<