Uva12504

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
  • 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 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值