UVA 12504 Updating a Dictionary(算法竞赛入门经典,stl)

算法竞赛入门经典,stl
本题要点:
1、处理每一条字符串的时候,使用 字符串流stringstream 来处理,先把原来的字符串
中的字符 ‘{’, ‘}’, ‘,’ 替换为 空格 ’ ', 然后就好处理了。
2、使用 map<string, string> 来记录每一条字符串中对应 的 key 和 value
3、寻找第二天字符串新 增加的, 删除的, 修改的字符串,各自用一个 set 来存,
寻找一个 map 中,是否存在字符串 str , 用find函数。

#include<bits/stdc++.h>
using namespace std;
const int MaxN = 110;
int T;
string a, b;

void handle_str(string  s, map<string, string> &mp)
{
	int len = s.size();
	for(int i = 0; i < len; ++i)
	{
		if (s[i] == '{' || s[i] == '}' || s[i] == ',' || s[i] == ':')
			s[i] = ' ';	
	}
	stringstream input(s);
	string ky, val;
	while(input >> ky >> val)
	{
		mp[ky] = val;
	}
}

void print_set(const set<string> &s, char ch)
{
	if(s.empty())
		return;
	printf("%c", ch);
	set<string>::iterator it = s.begin();
	printf("%s", it->c_str());
	++it;
	while(it != s.end())
	{
		printf(",%s", it->c_str());	
		++it;
	}
	printf("\n");
}

void solve()
{
	map<string, string> mp1, mp2;
	handle_str(a, mp1);
	handle_str(b, mp2);
	set<string> s1, s2, s3;	//增加,删除, 修改	
	map<string, string>::iterator it = mp2.begin();
	while(it != mp2.end())
	{
		map<string, string>::iterator tmp = mp1.find(it->first);
		if(tmp != mp1.end())
		{
			if(it->second != tmp->second)	
			{
				s3.insert(it->first);
			}
		}else{
			s1.insert(it->first);
		}
		++it;
	}
	it = mp1.begin();
	while(it != mp1.end())
	{
		if(mp2.find(it->first) == mp2.end())	
		{
			s2.insert(it->first);
		}
		++it;
	}
	print_set(s1, '+');
	print_set(s2, '-');
	print_set(s3, '*');
	if(s1.size() == 0 && s2.size() == 0 && s3.size() == 0)
	{
		printf("No changes\n");
	}
	printf("\n");
}

int main()
{
	scanf("%d", &T);
	getchar();
	while(T--)
	{
		cin >> a >> b;
		solve();
	}
	return 0;
}

/*
3
{a:3,b:4,c:10,f:6}
{a:3,c:5,d:10,ee:4}
{x:1,xyz:123456789123456789123456789}
{xyz:123456789123456789123456789,x:1}
{first:1,second:2,third:3}
{third:3,second:2}
*/

/*
+d,ee
-b,f
*c

No changes

-first
*/

猜你喜欢

转载自blog.csdn.net/qq_38232157/article/details/108312675