RPCC Day1 D

変数を含んだ式が文字列として与えられるので、別情報として与えられる単位系の関係から、式が表している単位を求める問題。
errorになるケースでは空のvectorが返り値になるように処理しています。

#include<iostream>
#include<string>
#include<map>
#include<vector>
#define pb push_back
using namespace std;

int n,m,p;
map<string,vector<int> > d;
string der[20];
map<string,string> v;

vector<int> parse(string s){
  vector<char> op;
  vector< vector<int> > res;
 
  for(int i=0;i<m;i++){
    if(der[i] == v[s])return d[v[s]];
  }

  int pos = 0;
  string tmp;
  while(pos<(int)s.size()){
    if(s[pos] == '('){
      int k = 1;
      pos++;

      while(pos<(int)s.size()){
	if(s[pos] == '(')k++;
	if(s[pos] == ')')k--;
	if(!k)break;
	tmp += s[pos];
	pos++;
      }
      res.pb( parse(tmp) );
      tmp.clear();
      pos++;
    }else if(s[pos] == '+' || s[pos] == '-' || 
	     s[pos] == '*' || s[pos] == '/'){
      if(tmp.size()){
	res.pb( parse(tmp) );
	tmp.clear();
      }
      op.pb( s[pos++] );
    }else tmp += s[pos++];
  }
  if(tmp.size())res.pb(parse(tmp));

  for(int i=0;i<(int)res.size();i++){
    if(res[i].empty())return res[i];
  }

  bool f = true;
  while(f){
    f = false;
    for(int i=0;i<(int)op.size();i++){
      vector<int> hoge;
      if(op[i] == '*'){
	for(int j=0;j<p;j++){
	  hoge.pb(res[i][j]+res[i+1][j]);
	}
      }else if(op[i] == '/'){
	for(int j=0;j<p;j++){
	  hoge.pb(res[i][j]-res[i+1][j]);
	}
      }
      if(hoge.size()){
	res.erase(res.begin()+i);
	res.erase(res.begin()+i);
	res.insert(res.begin()+i,hoge);
	op.erase(op.begin()+i);
	f = true;
	break;
      }
    }
  }

  while(res.size()>1){
    for(int i=0;i<n;i++){
      if(res[0][i] != res[1][i]){
	res[0].clear();
	return res[0];
      }
    }
    res.erase(res.begin());
  }
  return res[0];
}

int main(){
  while(cin >> n >> m >> p && (n||m||p)){
    for(int i=0;i<m;i++){
      cin >> der[i];
      vector<int> hoge;
      for(int j=0;j<n;j++){
	int a;
	cin >> a;
	hoge.pb(a);
      }
      d[der[i]] = hoge;
    }
    string str;
    cin >> str;
    for(int i=0;i<p;i++){
      string t1,t2;
      cin >> t1 >> t2;
      v[t1] = t2;
    }      
    vector<int> ans = parse(str);
    if(ans.empty())cout << "error\n";
    else{
      int i,j;
      for(i=m-1;i>=0;i--){
	bool f = true;
	for(j=0;j<n;j++){
	  if(d[der[i]][j] != ans[j])break;
	}
	if(j==n){
	  cout << der[i] << endl;
	  break;
	}
      }
      if(i<0)cout << "undefined\n";
    }
  }

}