UVa 12504 - Updating a Dictionary

感觉我又犯二了,各种if,else if,一会儿看看题解。

明天有个院的对抗赛,我总有一种我要坑的预感。。。既然明天比赛,今天争取早点睡吧。



#include<iostream>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<cctype>
#define OLD_DIC old_dic_val.top().dic
#define OLD_VAL old_dic_val.top().val
#define NEW_DIC new_dic_val.top().dic
#define NEW_VAL new_dic_val.top().val
using namespace std;

struct dic_val {
    string dic, val;
};

struct cmp_dic {
    bool operator () (const dic_val &dic1, const dic_val &dic2) const {
        return dic1.dic > dic2.dic;
    }
};

string old_dic, new_dic;
priority_queue<dic_val, vector<dic_val>, cmp_dic> old_dic_val, new_dic_val;

void get_old_dic(string old_dic_w) {
    dic_val dic_w;
    if(old_dic_w.size() == 2) return ;
    for(int i = 0; old_dic_w[i] != '}'; i++) {
        if(isdigit(old_dic_w[i]))
            dic_w.val += old_dic_w[i];
        if(isalpha(old_dic_w[i]))
            dic_w.dic += old_dic_w[i];
        if(old_dic[i] == ','|| old_dic[i + 1] == '}') {
            old_dic_val.push(dic_w);
            dic_w.val.clear();
            dic_w.dic.clear();
        }
    }
}

void get_new_dic(string new_dic_w) {
    dic_val dic_w;
    if(new_dic_w.size() == 2) return ;
    for(int i = 0; new_dic_w[i] != '}'; i++) {
        if(isdigit(new_dic_w[i]))
            dic_w.val += new_dic_w[i];
        if(isalpha(new_dic_w[i]))
            dic_w.dic += new_dic_w[i];
        if(new_dic[i] == ','|| new_dic[i + 1] == '}') {
            new_dic_val.push(dic_w);
            dic_w.val.clear();
            dic_w.dic.clear();
        }
    }
}

int print(set<string> Set, char ch) {
    if(Set.empty())
        return 0;
    int cnt = 0;
    for(set<string>::iterator it = Set.begin();
        it != Set.end(); it++) {
            cnt ? cout << "," : cout << ch;
            cnt = 1;
            cout << *it;
        }
    cout << endl;
    return 1;
}

int main() {
    int n, cases = 0;
    cin >> n;
    while(n--) {
        int sign = 0;
        set<string> add_list, del_list, change_list;
        cin >> old_dic >> new_dic;
        get_old_dic(old_dic);
        get_new_dic(new_dic);
        while(!old_dic_val.empty()||
            !new_dic_val.empty()) {
            if(!old_dic_val.empty()&&
               !new_dic_val.empty()) {
                if(OLD_DIC == NEW_DIC) {
                    if(OLD_VAL == NEW_VAL) {
                        old_dic_val.pop();
                        new_dic_val.pop();
                    } else {
                        change_list.insert(OLD_DIC);
                        old_dic_val.pop();
                        new_dic_val.pop();
                    }
                } else if(OLD_DIC < NEW_DIC) {
                    del_list.insert(OLD_DIC);
                    old_dic_val.pop();
                } else {
                    add_list.insert(NEW_DIC);
                    new_dic_val.pop();
                }
            } else if(old_dic_val.empty()&&
                      !new_dic_val.empty()) {
                add_list.insert(NEW_DIC);
                new_dic_val.pop();
            } else if(!old_dic_val.empty()&&
                    new_dic_val.empty()) {
                del_list.insert(OLD_DIC);
                old_dic_val.pop();
            }
        }
        sign += print(add_list, '+');
        sign += print(del_list, '-');
        sign += print(change_list, '*');
        if(!sign) cout << "No changes" << endl;
        cout << endl;
    }
    return 0;
}


转载于:https://www.cnblogs.com/xuziye0327/p/4249277.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值