#include <cstdio>
#include <cstdlib>
//#define _OJ_
#define maxsize 100
typedef struct matrix
{
int row;
int colum;
} matrix;
typedef struct stack1
{
int top;
int base;;
char *elem;
} stack1, *stack;
stack
creat_stack(void)
{
stack s;
s = (stack) malloc (sizeof(stack1));
s->elem = (char*) malloc (sizeof(char) * maxsize);
s->top = s->base = 0;
return s;
}
void
push(stack s, char data)
{
s->elem[s->top++] = data;
}
char
pop(stack s)
{
return s->elem[--s->top];
}
int
isempty(stack s)
{
if(s->top == s->base)
return 1;
else
return 0;
}
char
get_top(stack s)
{
return s->elem[s->top - 1];
}
// ----------------------------------------------------------------------------------------
// matrix
// operater(matrix M, matrix T)
// {
// }
int
num_multi(stack s, char *str, matrix *M)
{
int sum = 0, i = 0;
char ch1;
while (str[i] != '\0') {
// printf("%c\n", str[i]);
if(isempty(s)) push(s, str[i]);
else if(str[i] == '(') push(s, str[i]);
else if('A' <= str[i] && str[i] <= 'Z') {
if('A' <= get_top(s) && get_top(s) <= 'Z') {
if(M[str[i] - 'A'].row != M[get_top(s) - 'A'].colum) return -1;
sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[str[i] - 'A'].colum;
M[get_top(s) - 'A'].colum = M[str[i] - 'A'].colum;
}
else
push(s, str[i]);
}
else if(str[i] == ')') {
ch1 = pop(s); pop(s);
if(isempty(s)) push(s, ch1);
else {
if(M[ch1 - 'A'].row != M[get_top(s) - 'A'].colum) return -1;
sum += M[get_top(s) - 'A'].row * M[get_top(s) - 'A'].colum * M[ch1 - 'A'].colum;
M[get_top(s) - 'A'].colum = M[ch1 - 'A'].colum;
}
}
// printf("sum = =%d\n", sum);
i++;
}
return sum;
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int result, row1, colum1, T, i, j, n1, n2;
char str[100];
char ch;
matrix M[26];
stack s;
s = creat_stack();
scanf("%d", &T); gets(str);
while(T--) {
scanf("%c %d %d", &ch, &row1, &colum1);
M[ch - 'A'].row = row1; M[ch - 'A'].colum = colum1;
// printf("%c %d %d\n", ch, row1, colum1);
gets(str);
}
gets(str);
result = num_multi(s, str, M);
if(result == -1) printf("error\n");
else printf("%d\n", result);
return 0;
}
/*给定n个矩阵{A1,A2,...,An},考察这n个矩阵的连乘积A1A2...An。由于矩阵乘法满足结合律,
故计算矩阵的连乘积可以有许多不同的计算次序,这种计算次序可以用加括号的方式来确定。
矩阵连乘积的计算次序与其计算量有密切关系。
例如,考察计算3个矩阵{A1,A2,A3}连乘积的例子。
设这3个矩阵的维数分别为10*100,100*5,和5*50。若按(A1A2)A3计算,
3个矩阵连乘积需要的数乘次数为10*100*5+10*5*50 = 7500。若按A1(A2A3)计算,
则总共需要100*5*50+10*100*50 = 75000次数乘。
现在你的任务是对于一个确定的矩阵连乘方案,计算其需要的数乘次数。
输入
输入数据由多组数据组成。每组数据格式如下:
第一行是一个整数n (1≤n≤26),表示矩阵的个数。
接下来n行,每行有一个大写字母,表示矩阵的名字,后面有两个整数a,b,分别表示该矩阵的行数和列数
,其中1<a,b<100。
第n+1行是一个矩阵连乘的表达式,由括号与大写字母组成,没有乘号与多余的空格。
如果表达式中没有括号则按照从左到右的顺序计算,输入的括号保证能够配对。
输出
对于每组数据,输出仅一行包含一个整数,即将该矩阵连乘方案需要的数乘次数。
如果运算过程中出现不满足矩阵乘法法则的情况(即左矩阵列数与右矩阵的行数不同),
则输出“error”。
样例输入
3
A 10 100
B 100 5
C 5 50
A(BC)
样例输出
75000*/
--------------------------------------------------------------------------------------------------------------------------------------
5
A 10 100
B 100 5
C 5 50
D 50 2
E 2 100
A(B(C(D(E))))
-------------
185000;;;;;