Ranking (as of 2015-04-11): 54 out of 134
Language: C++
/*
UVa 939 - Genes
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_939_Genes.cpp
*/
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int N_max = 3100;
map<string, int> names;
enum {non_existent, recessive, dominant};
const int nr_status = dominant - non_existent + 1;
const string status_strings[nr_status] = {
"non-existent", "recessive", "dominant"
};
const int hypothesis[nr_status][nr_status] = {
{non_existent, non_existent, recessive},
{non_existent, recessive, dominant},
{recessive, dominant, dominant}
};
struct person {
int parent_, other_parent_;
int status_;
} persons[N_max];
int get_status(int pi)
{
if (persons[pi].status_ != -1)
return persons[pi].status_;
int parent_status = get_status(persons[pi].parent_),
other_parent_status = get_status(persons[pi].other_parent_);
return persons[pi].status_ = hypothesis[parent_status][other_parent_status];
}
int main()
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
persons[i].parent_ = persons[i].other_parent_ = persons[i].status_ = -1;
int nr_persons = 0;
while (N--) {
string s, t;
cin >> s >> t;
pair<map<string, int>::iterator, bool> result =
names.insert(make_pair(s, nr_persons));
int pi = result.first->second;
if (result.second)
nr_persons++;
int i;
for (i = 0; i < nr_status; i++)
if (t == status_strings[i]) {
persons[pi].status_ = i;
break;
}
if (i == nr_status) {
result = names.insert(make_pair(t, nr_persons));
person& c = persons[result.first->second];
if (c.parent_ == -1)
c.parent_ = pi;
else
c.other_parent_ = pi;
if (result.second)
nr_persons++;
}
}
for (map<string, int>::const_iterator ni = names.begin(), ne = names.end();
ni != ne; ++ni)
cout << ni->first << ' ' << status_strings[get_status(ni->second)] << endl;
return 0;
}
No comments:
Post a Comment