题目很好理解,提醒几点:
1.value可能很长,选字符串存储 映射关系选用map
2.每个字典都可以是空的,在映射的时候不要映射空的 字符串,因为它不是key,也不是value
3.每组数据后都要加空行
4.同一组测试数据中,“No changes” 与 “+ - *”不会同时输出
代码如下:
char ch;
void input (map<string, string>& mp) {
getchar(); //读掉 '{'
string s[2]; int op(0);
while(ch = getchar()) {
if(ch == '}' || ch == ',') {
op = 0; // 空串不要映射
if(s[0] != "") mp[s[0]] = s[1];
s[0] = s[1] = "";
if(ch == '}') {getchar(); return;}
}
else if(ch == ':') op = 1;
else s[op] += ch;
}
}
void output (char cc, vector<string> v) {
if(!v.size()) return; //空就返回吧
for(int i = 0; i < v.size(); i++)
cout << (i ? ',': cc) << v[i];
printf("\n");
}
int main() {int T; cin >> T; getchar();
while(T--) {
map<string, string>::iterator it;
map<string, string> pu, pd;
input(pu); input(pd);
vector<string> v1, v2, v3;
for(it = pd.begin(); it != pd.end(); it++) {
if(!pu.count(it->first))
v1.push_back(it->first);
}
output('+', v1);
for(it = pu.begin(); it != pu.end(); it++) {
if(!pd.count(it->first))
v2.push_back(it->first);
}
output('-', v2);
for(it = pd.begin(); it != pd.end(); it++) {
if(pu.count(it->first) && pu[it->first] != pd[it->first]) //一定要先判是否存在映射关系
v3.push_back(it->first);
}
output('*', v3);
if(!v1.size() && !v2.size() && !v3.size())
printf("No changes\n"); //放在最后判断一下
printf("\n");
}
return 0;
}