從機器中,不斷地出現「?」個英文字母的單字,現在要你抄寫下來,
倘若這個單字已經出現過,則會使用編號上的號碼直接書寫
倘若這個單字沒有出現過,則會賦予單字一個新的號碼
每組新的測資,代表不同事件,請勿將其納入新的號碼
範例測資
範例輸入 | 範例輸出 |
---|---|
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