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[2]分别存储旧,新字典出现的键。
  • 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;
}
posted @ 2018-05-22 17:42  Western_Trail  阅读(127)  评论(0编辑  收藏  举报