Updating a Dictionary——UVA - 12504

也可以查看這裏

題目鏈接

題目大意:給出一箇舊詞典和新詞典,詞典是以鍵值對的方式存儲的,輸出二者的變化:
1、如果至少包含一個新增鍵,那麼先輸出一個+,後面輸出所有新增的鍵,用,分隔,按字典序上升輸出
2、如果至少包含一個刪除鍵,那麼先輸出一個-,後面輸出所有刪除的鍵,用,分隔,按字典序上升輸出
3、如果至少包含一個修改鍵,那麼先輸出一個*,後面輸出所有修改的鍵,用,分隔,按字典序上升輸出

其實這個題手暴也可以過去的,但是看到了一個dalao寫的方法比較好,所以就寫一下題解
我們其實可以用stringstream來解決輸入,輸入時以string輸入,接着講這個字符串中"{"、"}"、":"、","的位置全換成空格,
再接着只要用stringstream輸入就行了,後面只要用三個set保存每一個結果即可

代碼:

#include <set>
#include <map>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>

using namespace std;

string s , t;
set < string > add , del , alt;
map < string , string > mp1 , mp2;

inline void init()
{
    mp1.clear();
    mp2.clear();
    add.clear();
    del.clear();
    alt.clear();
}

void solve(string a , map < string , string > & m)
{
    //首先將字符串中特定的字符換成空格
    //注意這裏循環裏面不能寫i < a.length()
    int len = a.length();
    for(int i = 0 ; i < len ; ++ i)
        if(a[i] == '{' || a[i] == '}' || a[i] == ',' || a[i] == ':')
            a[i] = ' ';
            
    stringstream in(a);
    
    string x , y;
    while(in >> x >> y) m[x] = y;
}

int main(void)
{
    int T;
    cin >> T;getchar();
    while(T--)
    {
        init();//初始化
        cin >> s;//輸入舊詞典
        cin >> t;//輸入新詞典
        
        //根據字符串構建詞典
        solve(s , mp1);
        solve(t , mp2);
        
        for(auto i : mp2)
            if(mp1.find(i.first) == mp1.end()) add.insert(i.first);
            
        for(auto i : mp1)
            if(mp2.find(i.first) == mp2.end()) del.insert(i.first);
            else if(mp2[i.first] != i.second) alt.insert(i.first);
        
        if(add.empty() && del.empty() && alt.empty())
        {
            puts("No changes");
            puts("");
            continue;
        }
        
        if(!add.empty())
        {
            cout << "+";
            for(auto i : add)
            {
                if(i != *add.begin()) cout << ",";
                cout << i;
            }
            puts("");
        }
        
        if(!del.empty())
        {
            cout << "-";
            for(auto i : del)
            {
                if(i != *del.begin()) cout << ",";
                cout << i;
            }
            puts("");
        }
        if(!alt.empty())
        {
            cout << "*";
            for(auto i : alt)
            {
                if(i != *alt.begin()) cout << ",";
                cout << i;
            }
            puts("");
        }
        puts("");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章