I can't seem to get AC on this one... My program solves all the test cases here, but gets a floating point exception after about 2 seconds.
my code:
Code: Select all
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
vector<char> opmap;
vector<int> pre;
vector<int> preused;
vector<char> acc;
vector<char> acce;
int doop ( int t1, int t2, char op )
{
//cerr << acce[op] << "(" << t1 << " " << opmap[op] << " " << t2 << ") ";
switch (opmap[op])
{
case '-':
return t1 - t2;
break;
case '+':
return t1 + t2;
break;
case '*':
return t1 * t2;
break;
case '/':
return t1 / t2;
break;
}
}
int eval ( vector<int> & terms, vector<char> & ops, int ts=-1, int te=-1,
int p=9 )
{
// cerr << endl << ts << " " << te << endl;
while (p>=0)
{
if (!preused[p])
p--;
else
{
vector<int> rem(terms.size(), 0);
int any = 0;
if (ts == -1)
{
int start = 0;
while (true)
{
//cout << ops.size() << endl;
int start;
int end;
int i;
for (i=0; i<terms.size(); i++)
if (pre[ops[i]]==p)
break;
start = i;
if (start<terms.size())
{
for (i=start; i<terms.size(); i++)
if (ops[i]!=ops[start] && ops[i]!=' ')
break;
end = i;
if ((end-start)>=1)
{
eval(terms, ops, start, end-1, p);
any = 1;
}
else
break;
}
else
break;
/*for (int i=0; i<ops.size(); i++)
{
if (ops[i]==' ')
cout << ' ';
else
cout << opmap[ops[i]];
}
cout << "|" << endl;*/
}
}
char ac = ' ';
if (ts>=0)
ac = acce[ops[ts]];
if ((ac=='L') && !any)
{
int start = 0, end = terms.size()-1;
if (ts>=0)
{
start = ts; end = te;
}
for (int i=start; i<=end; i++)
{
if (pre[ops[i]]==p && ops[i]!=' '&& !rem[i]
&& acce[ops[i]]=='L')
{
int i1=i+1;
while (i1<rem.size() && rem[i1])
i1++;
if (i1<rem.size())
{
any = 1;
terms[i] = doop(terms[i], terms[i1], ops[i]);
ops[i] = ops[i1];
rem[i1] = 1;
i--;
}
}
}
}
if ((ac=='R')&&!any)
{
int start = terms.size()-2;
int end = 0;
if (ts>=0)
{
start = te;
end = ts;
}
// cerr << "x";
for (int i=start; i>=end; i--)
{
// cerr << "*" << i;
if (pre[ops[i]]==p && ops[i]!=' '&&!rem[i]
&& acce[ops[i]]=='R')
{
int i1=i+1;
while (i1<rem.size() && rem[i1])
i1++;
if (i1<rem.size())
{
any = 1;
terms[i] = doop(terms[i], terms[i1], ops[i]);
ops[i] = ops[i1];
rem[i1] = 1;
//i++;
}
}
}
// cerr << "y";
}
vector<int> newt;
vector<char> newo;
//cerr << endl;
if (ts>=0)
{
for (int i=0; i<terms.size(); i++)
{
int ted = 0;
if (!rem[i])
{
//cerr << terms[i] << opmap[ops[i]];
newt.push_back(terms[i]);
newo.push_back(ops[i]);
if (i>=ts && i<=te)
ted++;
}
te-=ted;
}
//cerr << endl;
terms = newt;
ops = newo;
}
if (ops.size()==1)
return terms[0];
if (!any)
{
if (ts>=0)
return 0;
p--;
}
else
{
if (ts>=0)
te--;
}
}
}
}
int main ( void )
{
string line;
getline(cin, line);
istringstream iss(line);
int cases;
iss >> cases;
getline(cin, line);
for (int casen=1; casen<=cases; casen++)
{
char _opmap[256] = { 0 };
int _pre[256] = { 0 };
int _preused[50] = { 0 };
char _acc[10] = { 0 };
char _acce[256] = { 0 };
string rule;
int i;
for (i=0; i<4; i++)
{
getline(cin, rule);
_opmap[rule[1]] = rule[0];
int p = (rule[2]-'0');//*4+(3-i);
_pre[rule[1]] = p;
_preused[p]++;
_acc[p] = rule[3];
_acce[rule[1]] = rule[3];
}
opmap = vector<char>(_opmap, _opmap+256);
pre = vector<int>(_pre, _pre+256);
preused = vector<int>(_preused, _preused+50);
acc = vector<char>(_acc, _acc+10);
acce = vector<char>(_acce, _acce+256);
while (true)
{
string exp;
getline (cin, exp);
if (exp.length()==0)
break;
istringstream xin(exp);
int count = 0;
if (opmap[xin.peek()]=='-')
{
int x = -1;
while (x<0) x--;
}
vector<int> terms;
vector<char> ops;
int t; char o;
while (xin >> t)
{
cout << t;
if (xin>>o)
cout << opmap[o];
else
o = ' ';
terms.push_back(t);
ops.push_back(o);
}
cout << " = ";
cout << eval(terms, ops);
cout << endl;
}
if (casen<cases)
cout << endl;
}
return 0;
}
any more test cases? or any idea what I'm doing wrong?
thanks