UVA12504-更新字典

题意:

大概是给你两个字典,old和new,让你比对两个字典的不同。

如果某个元素,在old中没有在new中有,那么这个元素是“+”

反之是"-",如果该元素old和new中都有但是value不同,那么这个元素是"*"。

这里采取了一种易读的写法,三个迭代器分别遍历三次,其实只要两个迭代器同时遍历就可以做到现在的效果。

输入用流输入就好,数据存储使用容器。

//UVA不return 0 会WA。。。我还以为是我做错了OTZ

#include <iostream>
#include <strstream>
#include <sstream>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
using namespace std;
char bufold[1000],bufnnew[1000];
string key,value;
map<string,string>old,nnew;
map<string,string>::iterator it;
set<string>add,sub,cha;
set<string>::iterator itt;
inline void filter(char *str,int n){
    for(int i=0;i<n;i++)if(str[i]=='{'||str[i]==':'||str[i]==','||str[i]=='}')str[i]=' ';
}
int main()
{
    int n;
    cin>>n;
    getchar();
    while(n--)
    {
        gets(bufold);
        gets(bufnnew);
        filter(bufold,strlen(bufold));
        filter(bufnnew,strlen(bufnnew));
        istringstream oldin(bufold);
        istringstream nnewin(bufnnew);
        old.clear();nnew.clear();
        while(oldin>>key>>value)old[key]=value;
        while(nnewin>>key>>value)nnew[key]=value;
        add.clear();sub.clear();cha.clear();
        for(it=nnew.begin();it!=nnew.end();it++)
            if(old.find(it->first)==old.end())add.insert(it->first);
        for(it=old.begin();it!=old.end();it++)
            if(nnew.find(it->first)==nnew.end())sub.insert(it->first);
        for(it=nnew.begin();it!=nnew.end();it++)
            if(old.find(it->first)!=old.end()&&old[it->first]!=it->second)
                cha.insert(it->first);
        if(add.empty()&&sub.empty()&&cha.empty()){
            cout<<"No changes"<<endl;
        }
        if(!add.empty()){
            cout<<"+"<<*(add.begin());
            for(itt=add.begin(),itt++;itt!=add.end();itt++)cout<<","<<*itt;cout<<endl;
        }
        if(!sub.empty()){
            cout<<"-"<<*(sub.begin());
            for(itt=sub.begin(),itt++;itt!=sub.end();itt++)cout<<","<<*itt;cout<<endl;
        }
        if(!cha.empty()){
            cout<<"*"<<*(cha.begin());
            for(itt=cha.begin(),itt++;itt!=cha.end();itt++)cout<<","<<*itt;cout<<endl;
        }
        cout<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值