/* Wed Nov 12 23:01:35 JST 2003 : Start */ /* Thu Nov 13 00:01:56 JST 2003 : Resume */ /* Thu Nov 13 16:21:54 JST 2003 : Restart */ /* Thu Nov 13 17:58:21 JST 2003 : Time-Limit Exceeded, Resume */ /* Thu Nov 13 20:50:54 JST 2003 : Restart */ /* Thu Nov 13 21:15:32 JST 2003 : Accepted */ #include #include #include #include #include #include #include // record field data map > db; map recordset, fieldset; list listrecord(string record) { list recordlist; if (record == "*") { for (map::iterator i = recordset.begin(); i != recordset.end(); i++) { recordlist.push_back(i->first); } } else { int pos = 0, comma; while (string::npos != (comma = record.find(",", pos))) { recordlist.push_back(record.substr(pos, comma - pos)); pos = comma + 1; } recordlist.push_back(record.substr(pos)); } return recordlist; } list listfield(string field) { list fieldlist; if (field == "*") { if (db.begin() != db.end()) { for (map::iterator i = fieldset.begin(); i != fieldset.end(); i++) { fieldlist.push_back(i->first); } } } else { int pos = 0, comma; while (string::npos != (comma = field.find(",", pos))) { fieldlist.push_back(field.substr(pos, comma - pos)); pos = comma + 1; } fieldlist.push_back(field.substr(pos)); } return fieldlist; } int newrecord(string recordname) { recordset.insert(make_pair(recordname, 0)); } int newfield(string fieldname) { fieldset.insert(make_pair( fieldname, 0)); } void command_append(string record, string field, string data) { if (recordset.find(record) == recordset.end()) { newrecord(record); } if ( fieldset.find( field) == fieldset.end()) { newfield ( field); } if (db[record].find(field) == db[record].end()) { recordset[record]++; fieldset[ field]++; db[record].insert(make_pair(field, data)); } else { db[record][field] += data; } } void command_show(string record, string field) { list recordlist, fieldlist; recordlist = listrecord(record); fieldlist = listfield(field); for (list::iterator i = recordlist.begin(); i != recordlist.end(); i++) { for (list::iterator j = fieldlist.begin(); j != fieldlist.end(); j++) { cout << *i << endl; cout << *j << endl; if (recordset.find(*i) == recordset.end() || fieldset.find(*j) == fieldset.end() || db[*i].find(*j) == db[*i].end()) { cout << "NO DATA" << endl; } else { cout << db[*i][*j]; } cout << "." << endl; } } cout << "*" << endl; } void command_delete(string record, string field) { list recordlist, fieldlist; recordlist = listrecord(record); fieldlist = listfield(field); for (list::iterator i = recordlist.begin(); i != recordlist.end(); i++) { if (recordset.find(*i) == recordset.end()) { continue; } for (list::iterator j = fieldlist.begin(); j != fieldlist.end(); j++) { if (fieldset.find(*j) == fieldset.end()) { continue; } if (db[*i].find(*j) == db[*i].end()) { continue; } db[*i].erase(*j); recordset[*i]--; fieldset[*j]--; if (fieldset[*j] == 0) { fieldset.erase(*j); } if (recordset[*i] == 0) { recordset.erase(*i); db.erase(*i); } } } } int main() { string line; // ifstream cin("data.in"); int i = 0; while (1) { string line; getline(cin, line); istringstream ist(line); string command; ist >> command; if (command == "append") { string record, field, data; ist >> record >> field; getline(cin, line); while (line != ".") { data += line; data += "\n"; getline(cin, line); } if (!data.empty()){ command_append(record, field, data); } } if (command == "show") { string record, field; ist >> record >> field; command_show(record, field); } if (command == "delete") { string record, field; ist >> record >> field; command_delete(record, field); } if (command == "rem") { ; } if (command == "done") { break; } } return 0; }