题目链接:Updating a Dictionary - UVA 12504 - Virtual Judge (vjudge.net)
这个题首先想到的就是用map,但是数据过大要注意不要用long long,用字符串储存数字比较好,
这个题不经意间想到字符串流可以分隔字符串的功能,但是题目中提到一句说是不含空白字符(这会不会是一种暗示呢?嘿嘿嘿),于是我就用了字符串流,把特定的字符都变成了空格字符,接着就是模拟了,由于要分别存储不同的键值而且还要按顺序输出,所以我就用了不同的数组分别存储,其实看没有注释的代码更能锻炼自己的读代码能力(其实是我自己懒得写,哈哈),这是我自己的感想,那么下面就看代码吧:
AC代码:
//头文件就不写了,问就是因为懒,,,
int n;
int main()
{
cin>>n;
while(n--)
{
map<string,string> case1;
map<string,string> case2;
vector<string> Add;
vector<string> Delete;
vector<string> Remove;
int kase=2;
while(kase--)
{
string s;
cin>>s;
for(int i=0;i<s.length();i++)
{
if(s[i]=='{'||s[i]=='}'||s[i]==',')
s[i]=' ';
}
stringstream line(s);
string s1;
while(line>>s1)
{
string key=s1.substr(0,s1.find(':'));
string value=s1.substr(s1.find(':')+1);
if(kase==1)
case1[key]=value;
if(!kase)
case2[key]=value;
}
}
for(auto p:case2)
{
if(case1.find(p.first)==case1.end())
Add.push_back(p.first);
else if(case1.find(p.first)!=case1.end()&&case1[p.first]!=p.second)
Remove.push_back(p.first);
}
for(auto q:case1)
{
if(case2.find(q.first)==case2.end())
Delete.push_back(q.first);
}
sort(Add.begin(),Add.end());
sort(Remove.begin(),Remove.end());
sort(Delete.begin(),Delete.end());
if(!Add.empty())
{
cout<<"+";
for(int i=0;i<Add.size();i++)
{
if(i==0)
cout<<Add[i];
else
cout<<","<<Add[i];
}
cout<<endl;
}
if(!Delete.empty())
{
cout<<"-";
for(int i=0;i<Delete.size();i++)
{
if(i==0)
cout<<Delete[i];
else
cout<<","<<Delete[i];
}
cout<<endl;
}
if(!Remove.empty())
{
cout<<"*";
for(int i=0;i<Remove.size();i++)
{
if(i==0)
cout<<Remove[i];
else
cout<<","<<Remove[i];
}
cout<<endl;
}
if(Add.empty()&&Remove.empty()&&Delete.empty())
cout<<"No changes"<<endl;
cout<<endl;
}
return 0;
}