UVa 12504 - Updating a Dictionary

来源:互联网 发布:表格制作软件手机软件 编辑:程序博客网 时间:2024/06/10 04:28

感觉我又犯二了,各种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().valusing 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;}


0 0