/*
Este evident ca o solutie care simula evaluarea expresiei nu s-ar fi incadrat ca timp sau ca memorie, deoarece rezultatele obtinute pe parcurs pot fi foarte mari,
desi rezultatul final este limitat de 101000. Pentru rezolvarea acestei probleme este necesara teorema chineza a resturilor :
Fie K numere prime distincte P1, P2,... ,PK si K resturi R1, R2,... RK.
Exista un numar natural unic N mai mic decat produsul celor K numere prime care satisface relatiile N = Ri (mod Pi).
Vom rezolva intai problema de 70%, adica variabilele si rezultatul sunt numere naturale. Daca alegem un numar suficient de numere prime astfel incat produsul lor sa fie mai mare decat 101000,
putem calcula rezultatul expresiei modulo fiecare numar prim in timp liniar si putem reconstitui rezultatul (care va fi unic) folosind teorema chineza a resturilor.
Putem reduce varianta cu numere intregi la problema initiala cu numere naturale adunand constanta 101000 la expresie.
Astfel se garanteaza ca rezultatul expresiei este in intervalul [0, 2*101000].
Deoarece lungimea expresiei este de 100.000 trebuiau se se foloseasca numere prime relativ mari. Solutia oficiala foloste aproximativ 120 de numere prime din intervalul [109, 2*109].
*/
#include<fstream>
#include<map>
#include<cstring>
#include<cstdlib>
#define MAX_LEN 1500
#define ll long long
using namespace std;
ifstream f("eval.in"); ofstream g("eval.out");
int N,p,P[120],R[120],V[26],MOD,p1[MAX_LEN],r1[MAX_LEN],p2[MAX_LEN],r2[MAX_LEN];
char var[26][MAX_LEN], expr[100005];
map <int, bool> H;
inline int is_prime(int n)
{ if(!(n%2)) return 0;
for(int i=3; i*i<=n; i+=2)
if(!(n%i)) return 0;
return 1;
}
int mod_var(char str[], int mod)
{ int i,ret=0;
for(i=str[0]=='-'; str[i]; i++)
ret=((ll) ret*10 + str[i]-'0') % mod;
return str[0] == '-' ? (mod-ret)%mod : ret;
}
inline void add(int &a, int b) {a=((ll)a+b)%MOD;}
inline void mul(int &a, int b) {a=((ll)a*b)%MOD;}
int eval(),term(),factor();
int eval()
{ int ret = term();
while(expr[p]=='+'||expr[p]=='-')
if(expr[p]=='+') {p++; add(ret,term());}
else {p++;add(ret,MOD-term());}
return ret;
}
int term()
{ int ret=factor();
while(expr[p]=='*') {p++; mul(ret,factor());}
return ret;
}
int factor()
{ int ret;
if(expr[p]=='(') {p++; ret=eval(); p++;}
else if(expr[p]=='[') {p++; ret=eval(); mul(ret,ret); p++;}
else if(expr[p]=='-') {p++; ret = -eval(); add(ret, MOD);}
else if(expr[p]=='+') {p++; ret=eval();}
else
if(expr[p]>='a'&&expr[p]<='z') {ret=V[expr[p]-'a']; p++;}
return ret;
}
inline void init(int a[], int b)
{ memset(a,0,MAX_LEN*sizeof(int));
for(;b;b/=10) a[++a[0]]=b%10;
}
int modM(int a[], int b)
{ int i,ret=0;
for(i=a[0];i;i--) ret=((ll)ret*10+a[i])%b;
return ret;
}
void addM(int a[], int b[])
{ int i,t=0;
for(i=1;i<=a[0] || i<=b[0] || t; i++,t/=10)
a[i]=(t+=a[i]+b[i])%10;
a[0]=i-1;
}
void scadM(int a[], int b[])
{ int i,t=0;
for(i=1;i<=a[0];i++)
{ a[i]-=b[i]+t;
a[i]+=(t=a[i]<0)*10;
}
for(;a[0] && !a[a[0]]; a[0]--);
}
void prodM(int a[], int b)
{ int i; ll t=0;
for(i=1;i<=a[0] || t; i++,t/=10)
a[i]=(t+=(ll)a[i]*b)%10;
a[0]=i-1;
}
void prodM(int a[], int b[])
{ int i,j,c[MAX_LEN]; ll t;
memset(c, 0, sizeof(c));
for(i=1; i<=a[0]; i++)
{ for(j=1,t=0; j<= b[0]||t; j++, t/=10)
c[i+j-1]=(t+=c[i+j-1]+(ll)a[i]*b[j])%10;
if(c[0]<i+j-2) c[0]=i+j-2;
}
memcpy(a,c,sizeof(c));
}
int pow(int a, int b, int mod)
{ int t;
if(b==0) return 1;
t=pow(a,b>>1,mod);
t=((ll)t*t)%mod;
if(b&1) t=((ll)t*a)%mod;
return t;
}
int main(void)
{ int i,j,k,n,a,b,t[MAX_LEN];
f>>N;
for(i=0;i<N;i++) f>>var[i];
f>>expr;
for(i=0;i<120;i++)
{ do n=1000000000+(rand()>>1); while(H[n] || !is_prime(n));
H[n]=true; P[i]=n;
for(j=0; j<N; j++) V[j]=mod_var(var[j],P[i]);
p=0; MOD=P[i];
R[i]=eval();
add(R[i],pow(10,1000,MOD));
}
init(p1,P[0]); init(r1,R[0]);
for(i=1; i<120; i++)
{ init(p2,P[i]); init(r2,R[i]);
a=modM(r2,P[i])-modM(r1,P[i]);
while(a<0) a+=P[i];
b=pow(modM(p1,P[i]),P[i]-2,P[i]);
k=((ll)a*b)%P[i];
if (k)
{ memcpy(t,p1,sizeof(p1));
prodM(t,k); addM(r1,t);
}
prodM(p1,p2);
}
memset(t,0,sizeof(t));
t[0]=1001; t[1001]=1;
if(r1[0]<1001)
{ scadM(t,r1);
memcpy(r1,t,sizeof(t));
g<<"-";
} else scadM(r1,t);
for(i=r1[0];i;i--) g<<r1[i];
g<<'\n'; g.close(); return 0;
}