1. JAVA, Gunnar Hage


/**
* FWP-Fach: ACM programming Contest WS 08/09 "442 Matrix Chain Multiplication"
* Verdict: accepted / 0.070
*
* Gunnar Hage, gunnarhage@gmx.de
* AP5(IFB5A) Dez. 2008
* Vorgehen: Der String wird mit Klammern in eine ArrayList aufgenommen.
* Bei zwei Buchstaben nebeneinander wird "reduktiert" aus (,A,B,) wird -> ,J...
* Die 10 ist hier weil vorher 9 Matrizen iengelesen wurden.-1,0,1,-1 -> 10
Input:
9
A 50 10
B 10 20
C 20 5
D 30 35
E 35 15
F 15 5
G 5 10
H 10 20
I 20 25
A
B
C
(AA)
(AB)
(AC)
(A(BC))
((AB)C)
(((((DE)F)G)H)I)
(D(E(F(G(HI)))))
((D(EF))((GH)I))
AB

AB hinzugefügt... läuft auch :D

Output:
0
0
0
error
10000
error
3500
15000
40500
47500
15125

*/


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
public static void main(String... args) throws IOException{
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n[] = new int[2000];
int m[] = new int[2000];
//einlesen
int mC = Integer.parseInt(br.readLine())-1; //MatrixCount
for(int i=0;i<=mC;i++)
{
StringTokenizer st = new StringTokenizer(br.readLine());
char a = st.nextToken().charAt(0);
n[a-'A']= Integer.parseInt(st.nextToken());
m[a-'A']= Integer.parseInt(st.nextToken());
}
//einlesen der Fälle.
while(br.ready())
{
int mults = 0;
char[] l = br.readLine().toCharArray();
ArrayList<Integer> line = new ArrayList<Integer>();
for(char c: l)
if(c>='A' && c <='Z')
line.add((int)c-65); // escapevalues für klammern!
else
line.add(-1); // escapevalue für Zahlen.

int rP = 0; //readPointer
boolean error = false;
while(line.size()>1 && rP<line.size() && !error)
{
if(line.get(rP)>-1 && line.get(rP+1)>-1)
{
if(m[line.get(rP)]!=n[line.get(rP+1)])
error = true; // es wurde mind. einmal ungültig multipliziert.
mults = mults + n[line.get(rP)] * m[line.get(rP)] * m[line.get(rP+1)];
mC++; n[mC]=n[line.get(rP)]; m[mC]=m[line.get(rP+1)]; // neue Matrix anlegen.
line.add(rP, mC); // neue Matrix einfügen
// alte Matrizen entfernen
if(rP>=1)
line.remove(rP-1);//Klammer (
line.remove(rP); //Matrix1
line.remove(rP); //Matrix2
if(line.size()>=rP) // Klammer )
line.remove(rP);
// lesePosition korrigieren.
if(rP>1)
rP-=2;
else
rP=0;
}
else
rP++;
}
if(error)
bw.append("error\n");
else
bw.append( mults + "\n");
}
bw.flush();
bw.close();
System.exit(0);
}
}

2. C++, Evgeni Pavlidis

/**
* ACM programming Contest WS 08/09
* UVa Status: accepted
* Run Time: 0.000
* Category: strings
* @author Evgeni Pavlidis evgenipavlidis@yahoo.de
*/

#include <map>
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

#define DEBUG false

struct dim {
int rows;
int columns;
};

map<char, dim> m;
static int sum;

bool calcMults(string s)
{
char save = 'a';
while(s.length() > 1)
for(int i=0; i < s.length()-1; i++)
if(isalpha(s[i]) && isalpha(s[i+1]))
{
if(DEBUG)
cout << i << s << endl;

if(m[s[i]].columns != m[s[i+1]].rows)
return false;

sum += m[s[i]].rows * m[s[i]].columns * m[s[i+1]].columns;
m[save].rows = m[s[i]].rows;
m[save].columns = m[s[i+1]].columns;
s.replace(i-1,4,1,save++);
}

return true;

}

int main()
{

int matrices, r, c;
char tmp;

cin >> matrices;
for(int i=0; i < matrices; i++)
{
cin >> tmp;
cin >> r;
cin >> c;
m[tmp].rows = r;
m[tmp].columns = c;
}


string expression;
while(cin >> expression)
{
sum = 0;
if(calcMults(expression))
cout << sum << endl;
else
cout << "error" << endl;
}

return 0;
}