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"; } } }