ZeroJudge D518: 文字抄寫 II

從機器中,不斷地出現「?」個英文字母的單字,現在要你抄寫下來,
倘若這個單字已經出現過,則會使用編號上的號碼直接書寫
倘若這個單字沒有出現過,則會賦予單字一個新的號碼

每組新的測資,代表不同事件,請勿將其納入新的號碼

範例測資

範例輸入範例輸出
EOF 輸入,每組輸入的第一行,有一個數字 N (1 ≦ N ≦ 104)
接下來會有瘋狂科學家講出的 N 行單字
每行由小寫字母 a 到 z 所構成的 ? 字單字 (1 ≦ ? ≦ 20)
若這個字串之前已經出現過,則輸出號碼,若沒有則輸出它將被編寫的號碼。
5
eine
isis
zwei
drei
zwei
6
abc
abcd
abdc
aabb
bca
abc
8
aaa
aab
aaa
aac
aaaabbbsc
caa
aaba
aab
New! 1
New! 2
New! 3
New! 4
Old! 3
New! 1
New! 2
New! 3
New! 4
New! 5
Old! 1
New! 1
New! 2
Old! 1
New! 3
New! 4
New! 5
New! 6
Old! 2

解題思路

使用 Map 來紀錄每個字串是否出現過,預設一個為 1 的變數來存取每個新字串的編號,如果字串為新的字串,則將這個字串的Map值設定為編號變數,然後這個變數 +1。如果是舊的字串則輸出這個舊字串的 Map 值。

範例程式碼-ZeroJudge D518: 文字抄寫 II

#include <iostream>
#include <map>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N;
    while (cin >> N)
    {
        map<string, int>MAP;
        int count = 1;
        for (int i = 0; i<N; i++)
        {
            string str;
            cin >> str;
            if (MAP[str] == 0)
            {
                MAP[str] = count;
                cout << "New! " << count << "\n";
                count++;
            }
            else cout << "Old! " << MAP[str] << "\n";
        }
    }
}

//ZeroJudge D518
//Dr. SeanXD

發佈留言