本来一道很简单的题目,但因为种种细节问题,错了两遍!
题意不说了,原文很好理解,但是注意的是,输出按照字典序输出,因为自己英语不好(T T)lexicographically这个单词就自动忽略他了,其实这就是按照字典序输出的意思!哎!
整体思路:
1.输入
2.建立两个map分别是新旧字典,在建立三个vector<string>out[3]是记录最后三个结果,建立两个vector<string>cpe_new,cpe_old分别记录map里的内容!当然也可以直接遍历map里的内容!(就是用迭代器变量it遍历),最后一一对比处理即可!
技巧:
1.关于输入,可以用stringstream输入,先getline,把逗号和花括号自动变为空格,在输入进来,用例题5-11的方法!find 冒号:分隔成两部分,分别作为map的键和键值
注意:
1.对于getline,注意getchar()吃掉换行!前面scanf要吃一个,而对于我的方法是把输入分别写成了1个函数两个调用里,所以并不是每个getline后面都要加getchar(),而是只有第一个要吃换行!所以,只在第一个调用后面加getchar();
2.字典序输出的话直接给要输出的排序即可sort(out[i].begin(),out[i].end());
代码如下:
#include<map>
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
map<string,string>old,now;
vector<string>out[5],cpe_old,cpe_new;
const string flag[5] = {"+","-","*"};
void clear_all(){
old.clear();now.clear();
out[0].clear();out[1].clear();out[2].clear();
cpe_old.clear();cpe_new.clear();
}
void deal(const string&str,string &before,string &after){
int k = str.find(":");
before=str.substr(0,k);
after=str.substr(k+1);
}
void input(int way){
string str,code,key,value;
getline(cin,str);
for (int i = 0 ; i < str.size(); ++i)if (str[i] == ','||str[i]=='{'||str[i] == '}')str[i] =' ';
stringstream ss(str);
while(ss>>code){
deal(code,key,value);
if (way){cpe_new.push_back(key);now[key]=value;}
else {cpe_old.push_back(key);old[key]=value;}
}
if (!way)getchar();
}
void compare(){
for (int i = 0; i < cpe_new.size(); ++i){
string code=cpe_new[i];
if (!old.count(code))out[0].push_back(code);
if (old.count(code) && old[code] != now[code])out[2].push_back(code);
}
for (int i = 0; i < cpe_old.size(); ++i){
string code=cpe_old[i];
if (!now.count(code))out[1].push_back(code);
}
}
void print(){
if (!out[0].size() && !out[1].size() && !out[2].size())printf("No changes\n");
else {
for (int i = 0; i < 3; ++i)
if((int)out[i].size()){
sort(out[i].begin(),out[i].end());
cout << flag[i] << out[i][0];
for (int k = 1; k < out[i].size(); ++k)cout<<","<<out[i][k];
printf("\n");
}
}
}
int main(){
//freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
getchar();
while(n--){
clear_all();
input(0);//old
input(1);//new
compare();
print();
printf("\n");
}
return 0;
}