算法竞赛入门经典,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
*/