5-11 UVA 12504 Updating a dictionary更新字典

本来一道很简单的题目,但因为种种细节问题,错了两遍!

题意不说了,原文很好理解,但是注意的是,输出按照字典序输出,因为自己英语不好(T T)lexicographically这个单词就自动忽略他了,其实这就是按照字典序输出的意思!哎!

整体思路:

1.输入

2.建立两个map分别是新旧字典,在建立三个vector<string>out[3]是记录最后三个结果,建立两个vector<string>cpe_new,cpe_old分别记录map里的内容!当然也可以直接遍历map里的内容!(就是用迭代器变量it遍历),最后一一对比处理即可!

技巧:

1.关于输入,可以用stringstream输入,先getline,把逗号和花括号自动变为空格,在输入进来,用例题5-11的方法!find 冒号:分隔成两部分,分别作为map的键和键值

注意:

1.对于getline,注意getchar()吃掉换行!前面scanf要吃一个,而对于我的方法是把输入分别写成了1个函数两个调用里,所以并不是每个getline后面都要加getchar(),而是只有第一个要吃换行!所以,只在第一个调用后面加getchar();

2.字典序输出的话直接给要输出的排序即可sort(out[i].begin(),out[i].end());


代码如下:

#include<map>
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
map<string,string>old,now;
vector<string>out[5],cpe_old,cpe_new;
const string flag[5] = {"+","-","*"};
void clear_all(){
    old.clear();now.clear();
    out[0].clear();out[1].clear();out[2].clear();
    cpe_old.clear();cpe_new.clear();
}
void deal(const string&str,string &before,string &after){
    int k = str.find(":");
    before=str.substr(0,k);
    after=str.substr(k+1);
}
void input(int way){
    string str,code,key,value;
    getline(cin,str);
    for (int i = 0 ; i < str.size(); ++i)if (str[i] == ','||str[i]=='{'||str[i] == '}')str[i] =' ';
    stringstream ss(str);
    while(ss>>code){
        deal(code,key,value);
        if (way){cpe_new.push_back(key);now[key]=value;}
        else {cpe_old.push_back(key);old[key]=value;}
    }
    if (!way)getchar();
}
void compare(){
    for (int i = 0; i < cpe_new.size(); ++i){
        string code=cpe_new[i];
        if (!old.count(code))out[0].push_back(code);
        if (old.count(code) && old[code] != now[code])out[2].push_back(code);
    }
    for (int i = 0; i < cpe_old.size(); ++i){
        string code=cpe_old[i];
        if (!now.count(code))out[1].push_back(code);
    }
}
void print(){
    if (!out[0].size() && !out[1].size() && !out[2].size())printf("No changes\n");
    else {
        for (int i = 0; i < 3; ++i)
            if((int)out[i].size()){
                sort(out[i].begin(),out[i].end());
                cout << flag[i] << out[i][0];
                for (int k = 1; k < out[i].size(); ++k)cout<<","<<out[i][k];
                printf("\n");
            }
    }
}
int main(){
    //freopen("out.txt","w",stdout);
    int n;
    scanf("%d",&n);
    getchar();
    while(n--){
        clear_all();
        input(0);//old
        input(1);//new
        compare();
        print();
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(C语言,uva)