/*------------------------------------------------------------------------------ * problem004.cc: Find the passcode to the instructor's office. **----------------------------------------------------------------------------*/ /* Copyright (c) 2009 Peter Bui. All Rights Reserved. * * Peter Bui * **------------------------------------------------------------------------------ * Includes **----------------------------------------------------------------------------*/ #include #include #include #include #include using namespace std; /*------------------------------------------------------------------------------ * Type Definitions **----------------------------------------------------------------------------*/ typedef vector Entries; typedef vector Digits; typedef vector > Sets; /*------------------------------------------------------------------------------ * Macros **----------------------------------------------------------------------------*/ #define ctod(c) ((c) - '0') #define dtoc(d) ((d) + '0') /*------------------------------------------------------------------------------ * Functions **----------------------------------------------------------------------------*/ void read_entries(Entries &entries) { string entry; while (!getline(cin, entry).eof()) entries.push_back(entry); } void find_digits(Entries &entries, Digits &digits) { int _digits[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for (size_t e = 0; e < entries.size(); e++) for (size_t s = 0; s < entries[e].size(); s++) _digits[ctod(entries[e][s])]++; for (size_t i = 0; i < 10; i++) if (_digits[i]) digits.push_back(i); } void make_sets(Entries &entries, Digits &digits, Sets &sets) { sets = Sets(digits.size()); for (size_t e = 0; e < entries.size(); e++) { for (size_t d = 0; d < digits.size(); d++) { size_t s = entries[e].find(dtoc(digits[d])); if (s != string::npos) for (s = s + 1; s < entries[e].size(); s++) sets[d].insert(ctod(entries[e][s])); } } } /*------------------------------------------------------------------------------ * Main Execution **----------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { Entries entries; Digits digits; Sets sets; string passcode; read_entries(entries); find_digits(entries, digits); make_sets(entries, digits, sets); for (size_t d = 0; d < digits.size(); d++) { size_t s; for (s = 0; s < sets.size(); s++) if (sets[s].size() == 0 && digits[s] > 0) break; for (size_t ss = 0; ss < sets.size(); ss++) sets[ss].erase(digits[s]); passcode.push_back(dtoc(digits[s])); digits[s] = -1; } string::reverse_iterator it; for (it = passcode.rbegin(); it != passcode.rend(); it++) cout << *it; cout << endl; return (EXIT_SUCCESS); } /*------------------------------------------------------------------------------ * vim: sts=4 sw=4 ts=8 ft=cpp **----------------------------------------------------------------------------*/