Uva12504
题目地址:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3948
题意:
题意很简单,就是输入两个字符串,字符串包含一系列键值,然后比较这两个字符串,按题目要求进行输出即可.
分析:
首先还是要弄清楚解决这道题需要哪些STL容器,在本代码中我使用了
- 1个map<string,string>[2]分别存储旧字典和新字典中的,键值关系。注意这里不能使用map<string,LL>去存储,因为map的值可能会很大很大,否则会程序崩溃。
- 一个set
- 3个vector<>分别存储输出的三种情况。
第二是解决输入问题,本代码中使用了字符串流做输入。
弄清楚上述几点之后,接下来就是按题目要求死模拟了。
代码如下
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <set>
#include <map>
#include <vector>
#include <sstream>
typedef long long LL;
using namespace std;
vector<string> Add;
vector<string> Delete;
vector<string> Remove;
map<string,string> mp[2];
set<string> se[2];
int main(void){
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int n,k = 0;
string line;
cin>>n;
while(n--){
mp[0].clear();mp[1].clear();
se[0].clear();se[1].clear();
Add.clear();Delete.clear();Remove.clear();
for(int i = 0;i < 2;i++){
cin>>line;
for(int j = 0;j < line.length();j++){
if(line[j] == '{' || line[j] == ',' || line[j] == '}')
line[j] = ' ';
}
stringstream ss(line);
string s;
while(ss >> s){
string p = s.substr(0,s.find(":"));
string q = s.substr(s.find(":") + 1);
mp[i][p] = q; //存储键值对
se[i].insert(p);
}
}
//新增加
for(set<string>::iterator it = se[1].begin(); it != se[1].end(); ++it){
if(se[0].find(*it) == se[0].end()){
Add.push_back(*it);
}
}
//新删除
for(set<string>::iterator it = se[0].begin(); it != se[0].end(); ++it){
if(se[1].find(*it) == se[1].end()){
Delete.push_back(*it);
}
}
//新修改
for(set<string>::iterator it = se[1].begin(); it != se[1].end(); ++it){
if(se[0].find(*it) != se[0].end()){
string m = *it;
if(mp[0][m] != mp[1][m])
{
Remove.push_back(m);
}
}
}
//对vecotr全部进行排序
sort(Add.begin(),Add.end());
sort(Delete.begin(),Delete.end());
sort(Remove.begin(),Remove.end());
if(Add.empty() && Delete.empty() && Remove.empty() ){ //如果都为空
cout<<"No changes"<<endl;
}else{
if(!Add.empty()){
int k = 0;
cout<<"+";
for(int i = 0;i < Add.size();i++){
if(k > 0 ) cout<<",";
cout<<Add[i];
k++;
}
cout<<endl;
}
if(!Delete.empty()){
int k = 0;
cout<<"-";
for(int i = 0;i < Delete.size();i++){
if(k > 0 ) cout<<",";
cout<<Delete[i];
k++;
}
cout<<endl;
}
if(!Remove.empty()){
int k = 0;
cout<<"*";
for(int i = 0;i < Remove.size();i++){
if(k > 0 ) cout<<",";
cout<<Remove[i];
k++;
}
cout<<endl;
}
}
cout<<endl;
}
return 0;
}