Language: C++
/*
UVa 586 - Instant Complexity
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_586_Instant_Complexity.cpp
*/
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
using namespace std;
const int nr_coefficients_max = 10;
enum tree_node_types {program, op, loop_nr, loop};
struct tree_node {
tree_node* parent_;
tree_node* child_or_sibling_;
int type_;
int value_; // for op or loop_nr
int coefficients_[nr_coefficients_max + 1];
tree_node(tree_node* parent)
: parent_(parent), child_or_sibling_(NULL), type_(program)
{
memset(coefficients_, 0, sizeof(coefficients_));
}
~tree_node()
{
delete child_or_sibling_;
}
tree_node* insert_node(int type, int value) {
tree_node* tn = new tree_node(this);
if (!child_or_sibling_) // first child
child_or_sibling_ = tn;
else {
tree_node* stn = child_or_sibling_;
while (stn->child_or_sibling_)
stn = stn->child_or_sibling_;
stn->child_or_sibling_ = tn;
}
tn->type_ = type; tn->value_ = value;
if (tn->type_ == op)
tn->coefficients_[0] = value;
return tn;
}
void calculate_complexity() {
for (tree_node* tn = child_or_sibling_; tn; tn = tn->child_or_sibling_)
for (int i = 0; i <= nr_coefficients_max; i++)
coefficients_[i] += tn->coefficients_[i];
if (type_ == loop_nr)
for (int i = 0; i <= nr_coefficients_max; i++)
coefficients_[i] *= value_;
else if (type_ == loop) {
for (int i = nr_coefficients_max; i; i--)
coefficients_[i] = coefficients_[i - 1];
coefficients_[0] = 0;
}
delete child_or_sibling_;
child_or_sibling_ = NULL;
}
void print_complexity() {
bool printed = false;
for (int i = nr_coefficients_max; i >= 0; i--)
if (coefficients_[i]) {
if (coefficients_[i] < 0)
cout << '-';
else if (printed)
cout << '+';
if (i) {
if (abs(coefficients_[i]) > 1)
cout << abs(coefficients_[i]) << '*';
cout << 'n';
if (i > 1)
cout << '^' << i;
}
else
cout << abs(coefficients_[i]);
printed = true;
}
if (!printed)
cout << 0;
}
};
int main()
{
int k;
cin >> k;
for (int program_nr = 1; program_nr <= k; program_nr++) {
string s;
cin >> s; // "BEGIN"
tree_node* parent = new tree_node(NULL);
while (true) {
cin >> s;
if (s == "LOOP") {
cin >> s;
parent = (s == "n") ? parent->insert_node(loop, -1) :
parent->insert_node(loop_nr, atoi(s.c_str()));
}
else if (s == "OP") {
cin >> s;
parent->insert_node(op, atoi(s.c_str()));
}
else { // "END"
parent->calculate_complexity();
if (!parent->parent_)
break;
#ifdef DEBUG
parent->print_complexity();
cout << endl;
#endif
parent = parent->parent_;
}
}
cout << "Program #" << program_nr << "\nRuntime = ";
parent->print_complexity();
cout << "\n\n";
delete parent;
}
return 0;
}
No comments:
Post a Comment