1.If the left and right coins are even, both coins are genuine.
2.If the balance is not even, then all the coins not on the balance are genuine.
3.If one coin is heavy for one time, and light for the other time, it is a genuine coin.
//http://poj.org/problem?id=1013
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define weights 3
#define coins 12
int flag[coins + 1]; //If flag == 0, it's light; If flag == 1, it's even; flag == 2, heavy.; Flag == 3, not decided yet.
string sequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void one_weight(string left, string right, string judge){
if (judge == "even"){
for (int i = 0 ; i < left.size(); i ++)
flag[left[i] - 'A'] = 1;
for (int i = 0 ; i < right.size(); i ++)
flag[right[i] - 'A'] = 1;
}
if (judge == "up"){
map <int, int> weighted_coins;
map <int, int> :: iterator iter;
int coin_number = 0;
for (int i = 0 ; i < left.size(); i ++){
coin_number = left[i] - 'A';
weighted_coins[coin_number] = 1;
if (flag[coin_number] == 0)
flag[coin_number] = 1;
else if (flag[coin_number] != 1) //The coin is not a genuine one for sure yet.
flag[coin_number] = 2;
}
for (int i = 0 ; i < right.size(); i ++){
coin_number = right[i] - 'A';
weighted_coins[coin_number] = 1;
if (flag[coin_number] == 2)
flag[coin_number] = 1;
else if (flag[coin_number] != 1)
flag[coin_number] = 0;
}
for (int i = 0 ; i < coins ; i ++){
iter = weighted_coins.find(i);
if (iter == weighted_coins.end()) flag[i] = 1;
}
}
if (judge == "down"){
map <int, int> weighted_coins;
map <int, int> :: iterator iter;
int coin_number = 0;
for (int i = 0 ; i < left.size(); i ++){
coin_number = left[i] - 'A';
weighted_coins[coin_number] = 1;
if (flag[coin_number] == 2)
flag[coin_number] = 1;
else if (flag[coin_number] != 1) //The coin is not a genuine one for sure yet.
flag[coin_number] = 0;
}
for (int i = 0 ; i < right.size(); i ++){
coin_number = right[i] - 'A';
weighted_coins[coin_number] = 1;
if (flag[coin_number] == 0)
flag[coin_number] = 1;
else if (flag[coin_number] != 1)
flag[coin_number] = 2;
}
for (int i = 0 ; i < coins ; i ++){
iter = weighted_coins.find(i);
if (iter == weighted_coins.end()) flag[i] = 1;
}
}
}
int main(){
int case_number = 0;
cin >> case_number;
for (int i = 0 ; i < case_number ; i ++){
for (int j = 0 ; j < coins ; j ++)
flag[j] = 3;
string left, right, judge;
for (int j = 0 ; j < weights ; j ++){
cin >> left >> right >> judge;
one_weight(left, right, judge);
}
for (int j = 0; j < coins ; j ++){
if (flag[j] == 0) cout << sequence[j] << " is the counterfeit coin and it is light."<< endl;
if (flag[j] == 2) cout << sequence[j] << " is the counterfeit coin and it is heavy."<< endl;
}
}
}