Language: C++
/* UVa 12504 - Updating a Dictionary To build using Visual Studio 2012: cl -EHsc -O2 UVa_12504_Updating_a_Dictionary.cpp */ #include <iostream> #include <string> #include <vector> #include <map> using namespace std; void get_dictionary(const string& s, map<string, string>& dic) { const char* p = s.c_str(); p++; if (*p == '}') return; while (true) { const char* q = p; while (*p != ':') p++; string key = string(q, p - q); q = ++p; while (*p != ',' && *p != '}') p++; dic[key] = string(q, p - q); if (*p++ == '}') break; } } int main() { int T; cin >> T; while (T--) { map<string, string> old_dic, new_dic; string s; cin >> s; get_dictionary(s, old_dic); cin >> s; get_dictionary(s, new_dic); vector<string> added, removed, changed; map<string, string>::const_iterator oi = old_dic.begin(), oe = old_dic.end(), ni = new_dic.begin(), ne = new_dic.end(); for ( ; oi != oe && ni != ne; ) { if (oi->first < ni->first) { removed.push_back(oi->first); ++oi; } else if (oi->first > ni->first) { added.push_back(ni->first); ++ni; } else { if (oi->second != ni->second) changed.push_back(oi->first); ++oi; ++ni; } } for ( ; oi != oe; ++oi) removed.push_back(oi->first); for ( ; ni != ne; ++ni) added.push_back(ni->first); if (added.empty() && removed.empty() && changed.empty()) cout << "No changes\n"; else { if (!added.empty()) { for (size_t i = 0; i < added.size(); i++) cout << ((i) ? ',' : '+') << added[i]; cout << endl; } if (!removed.empty()) { for (size_t i = 0; i < removed.size(); i++) cout << ((i) ? ',' : '-') << removed[i]; cout << endl; } if (!changed.empty()) { for (size_t i = 0; i < changed.size(); i++) cout << ((i) ? ',' : '*') << changed[i]; cout << endl; } } cout << endl; } return 0; }
No comments:
Post a Comment