UVa 608 Counterfeit Dollar Solution

 #include <bits/stdc++.h>
using namespace std;
set<char> intersect(set<char> a,set<char> b){
    set<char> tmp;
    for(char c:b)
        if(a.find(c)!=a.end())
            tmp.insert(c);
    return tmp;
}
void printset(set<char> s){
    for(char c:s)
        cout<<c<<' ';
    cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
    vector<vector<string> > a(3,vector<string>(3));
    set<char> chars_set,faulty_left,faulty_right;
    int flag_left=0,flag_right=0;
    for(int i=0;i<=((int)'L'-(int)'A');i++)
        chars_set.insert((char)((int)'A'+i));
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            string s;
            cin>>ws>>s;
            a[i][j]=s;
        }
        if(a[i][2]=="down")   
            swap(a[i][0],a[i][1]),a[i][2]="up";
    }
    for(int i=0;i<3;i++){
        if(a[i][2]=="even"){
            for(char c:a[i][0])
                chars_set.erase(c);
            for(char c:a[i][1])
                chars_set.erase(c);
        }
        else{
            set<char> faulty_set,chars_set2;
            for(char c:a[i][0])
                faulty_set.insert(c);
            if(!flag_left)
                faulty_left=faulty_set,flag_left=1;
            else
                faulty_left=intersect(faulty_set,faulty_left);
            faulty_set.clear();
            for(char c:a[i][1])
                faulty_set.insert(c);
            if(!flag_right)
                faulty_right=faulty_set,flag_right=1;
            else
                faulty_right=intersect(faulty_set,faulty_right);
        }
    }
    set<char> ch;
    ch=intersect(faulty_left,chars_set);
    if(ch.size())chars_set=ch;
    ch=intersect(faulty_right,chars_set);
    if(ch.size())chars_set=ch;
    char anschar=(char)*(chars_set.begin());
    cout<<anschar<<" is the counterfeit coin and it is";
    int ans=0;
    for(int i=0;i<3;i++){
        if(ans)break;
        for(int j=0;j<3;j++){
            if(a[i][j].find(anschar)!=string::npos){
                if(j==0){
                    if(a[i][2]=="up")ans=2;
                    else ans=1;
                }
                else if(j==1){
                    if(a[i][2]=="up") ans=1;
                    else ans=1;
                }
            break;
            }
        }
    }
    cout<<' '<<(ans==1?"light":"heavy")<<'.'<<endl;
}
return 0;
}

Comments