//解题思路,逐个字符解析计算法则的字符串
//1.遇到'('直接跳过,看下一个元素
//2.遇到字母,入栈。若下一个字符也是字母,出栈一个元素与下一个矩阵直接计算出结果,
// 然后将计算后的矩阵入栈,直到下一个不是字母。
//3.遇到字母,入栈。若下一个字符不是字母,直接看下一个字符
//4.遇到')',如果是第一个,则跳过,如果不是第一个,则计算栈最上面两个矩阵的乘法次数,并累加
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
int fun(int n)
{
vector<pair<int,int>> v;//存矩阵
pair<int,int> p;
while(n--)
{
cin>>p.first>>p.second;
v.push_back(p);
}
string str;//存计算法则
cin>>str;
int num=0;//用来存乘法次数
stack<pair<int,int>> s;//栈,存计算后的矩阵
pair<int,int> p_tmp;//临时元素,存临时矩阵
int count=0;//用来标记')‘个数
for(int i=0;i<str.size();)
{
if(str[i]=='(') //遇到'('直接跳过,看下一个元素
{
i++;
continue;
}
if(str[i]>='A'&&str[i]<='Z')
{
{
s.push(v[str[i]-'A']);//遇到字母,入栈。
}
//若下一个字符也是字母,出栈一个元素与下一个矩阵直接计算出结果,
//然后将计算后的矩阵入栈,直到下一个不是字母。
while((i+1)<str.size()&&str[i+1]>='A'&&str[i+1]<='Z')
{
p_tmp.first=s.top().first;
p_tmp.second=v[str[i+1]-'A'].second;
num+=s.top().first*s.top().second*v[str[i+1]-'A'].second;
s.pop();
s.push(p_tmp);
i++;
}
//若下一个字符不是字母,直接看下一个字符
i++;
continue;
}
if(str[i]==')')
{
//遇到')',如果是第一个,则跳过,如果不是第一个,则计算栈最上面两个矩阵的乘法次数,并累加
if(count==0&&(i+1)<str.size())
{
count++;
i++;
continue;
}
if(s.size()>1)//栈中有多个元素,需要计算最上面两个矩阵
{
p_tmp.first=s.top().first;
p_tmp.second=s.top().second;
s.pop();
num+=s.top().first*s.top().second*p_tmp.second;
p_tmp.first=s.top().first;
s.pop();
s.push(p_tmp);
i++;
continue;
}
if(s.size()==1)//栈中只有一个元素则不用计算了
{
cout<<num<<endl;
return 0;
}
}
}
cout<<num<<endl;//最后输出乘法次数
return 0;
}
int main()
{
int n;
while(cin>>n)
{
fun(n);
}
}