/* * File: main.cpp * Author: cteam045 * * Created on October 22, 2016, 10:10 AM */ #include #include #include #include #include #include using namespace std; struct StringId { StringId(int id, const string & str) : m_Id(id), m_Str(str) {} int m_Id; string m_Str; }; void read(vector & tribune, const uint32_t & num) { for (uint32_t i = 1; i <= num; i++) { string buffer; cin >> buffer; tribune.push_back(StringId(i, buffer)); } } class Less { public: bool operator() (const StringId & one, const StringId & two) { set set; for (auto c : one.m_Str) set.insert(c); for (auto c : two.m_Str) { auto search = set.find(c); if (search == set.end()) return true; } return false; } }; /* * */ int main() { uint32_t num = 0; while (cin >> num) { vector tribune; read(tribune, num); /* for (auto sid : tribune) cout << sid.m_Id << ' ' << sid.m_Str << endl; */ Less less; map teams(less); for (auto row : tribune) { auto search = teams.find(row); if (search == teams.end()) teams.insert(make_pair(row, 1)); else search -> second++; } /* for (auto pair : teams) { cout << pair.first.m_Id << ' ' << pair.first.m_Str << endl; cout << pair.second << endl; } */ auto sid_bad = teams.begin() -> first; int cnt_bad = teams.begin() -> second; auto sid_good = teams.rbegin() -> first; int cnt_good = teams.rbegin() -> second; if (cnt_bad > cnt_good) { auto tmp = sid_bad; sid_bad = sid_good; sid_good = tmp; } set good_set; for (auto c : sid_good.m_Str) { good_set.insert(c); } int column = 1; set lets[tribune.size()]; for (size_t j = 0; j < tribune.size(); j++) { for (size_t i = 0; i < tribune.size(); i++) { if (i == (size_t)sid_bad.m_Id - 1) continue; lets[j].insert(tribune[i].m_Str.at(j)); } } /* for (size_t i = 0; i < tribune.size(); i++) { for (auto c : lets[i]) cout << c; cout << endl; } */ for (size_t i = 0; i < tribune.size(); i++) { auto search = lets[i].find(sid_bad.m_Str[i]); auto search_good = good_set.find(sid_bad.m_Str[i]); if (search != lets[i].end() || search_good == good_set.end()) { column = i + 1; break; } } map cnt_let; for (auto c : good_set) { cnt_let.insert(make_pair(c,0)); } for (auto c : sid_bad.m_Str) { auto search = cnt_let.find(c); if (search != cnt_let.end()) search -> second++; } char symbol = '0'; for (auto pair : cnt_let) if (pair.second == 0) { symbol = pair.first; break; } cout << sid_bad.m_Id << ' ' << column << ' ' << symbol << endl; } return 0; }