登録システム/登録システム
CodeForce Round 4 C
トピック接続:CF4C
タイトル説明
新しい電子メールサービス「Berlandeskは、」近い将来にバーランドにオープンされようとしています。サイトの管理は、彼らが助けをお願いする理由です、できるだけ早く彼らのプロジェクトを立ち上げたいと考えています。あなたは、サイトの登録システムのプロトタイプを実装することを提案しています。システムは、以下の原理で動作するはずです。
新しいユーザーが登録したいたびに、彼はシステムに彼の名前を持つ要求を送信します。そのような名前は、システムデータベースに存在しない場合は、データベースに挿入され、ユーザーが正常に登録を確認し、OK応答を取得します。名前がすでにシステムのデータベースに存在する場合、システムは、新しいユーザー名を構成するプロンプトとしてユーザーに送信しても、データベースにプロンプトを挿入します。新しい名前は次の規則によって形成されています。数字は、1から始まる(NAME1、NAME2、...)、少なくともこれらの数のうち私の名前に次々と追加され、私はその名前私は発見された私はまだデータベースに存在しません。
入力形式
最初の行は、数N含有Nを(1 <= N <= 10 ^ {5} 1 <= N <= 105)。次のn のn行は、システムへの要求が含まれています。各要求は非空行で、すべて小文字のラテン文字です以上、32個の文字で構成されています。
出力フォーマット
印刷するn個のnシステム要求への応答であるライン、:要求された名前がすでに使用されている場合は登録が成功の場合はOK、または新しい名前でプロンプト。
問題の意味の翻訳
トピックの背景
いわゆる「Berlanddesk」電子メールシステムは、ラインバーランドを操作しようとしています。電子メールシステム管理者は、できるだけ早く完了することができ、システム全体を構築したいので、彼らはあなたがそれらをプロトタイプのユーザー登録システムを開発することができますを期待上級プログラマを見つけました。
システム以下の原則の操作:
ユーザー名がすでにデータベースに、システムデータベースにユーザー名を存在しない場合は、新規ユーザ登録は、彼がシステムにコンテンツのユーザー名のリクエストを送信し、ユーザーが「OK」の応答情報は、それを示すために取得するとき正常に登録。ユーザーは、ユーザー名がデータベースに既に存在して要求した場合、システムは新しいユーザー名を生成し、データベースに追加されます。正の整数Iを構成するユーザ名を持つユーザによって要求された新しいユーザー名は、iが「ユーザ名i」はiデータベース内の最小の中に存在し、まだしていないということです。
入力形式
整数nの最初の行(1 <= N <= 10 ^ 5)。次のn行は、各行は、システムへのユーザからの要求を表します。各行と各非空の文字列は、32個の小文字のラテン文字で構成されています。
出力フォーマット
n行は、各行が行われた要求に応答してシステムを表します。ユーザー名はすでにシステムデータベース、出力「OK」に存在しない場合。ユーザー要求のユーザ名が登録されている場合は、規則に従って出力は、新しいユーザー名を生成しました。
サンプル入力と出力
入力#1
4
abacaba
acaba
abacaba
acab
出力#1
OK
OK
abacaba1
OK
入力#2
6
first
first
second
second
third
third
出力#2
OK
first1
OK
second1
OK
third1
考え
問題の意味
タイトルは、おそらく何の重複が直接出力がいたではありません、全体の重複を見つけることであることを意味しOK
、出力は元の文字列+繰り返し回数で繰り返されている場合、。
デスクトップ上の新しいフォルダと同様に、増加の背後にあるラベルに名前の重複があります。
当初の考え
タイトルを読んだ後、私は、シミュレーションを指示したいと思います。ユーザー名を入力して、アレイからのルックアップに保存され、統計カウントは一度インクリメントさを見つけます。しかし、データの量が権利を有している(10 ^ 5 \)\、そして、それはアナログ、その後見つけるにバインドされた文字列です。
シンプルな最適化
すべての新しく追加されたデータのために、我々は、入力文字列100、すべての「こんにちは」は、見つけることができる場合は、最も極端な例の一つを与え、再発見尾に我々は見つけるサイクル数を必要とするので、タイムアウトがある\ (1,2,3 ...... 100 \) 。これらの重複している文字列のために我々は、調査結果を置く検索それの重複を減らすことができませんか?これは明らかに可能です。文字列を繰り返してそれぞれの添加のために、その値は数だけ増加して、格納されている、我々は別の配列レコードにこの数を開くことができます。
参照コード
//CF4C_Registration system
#include<bits/stdc++.h>
#define MAXN 100000
using namespace std;
string name[MAXN + 5];//存储用户名,相同用户名只存储一次,重复输入只增加对应的cnt数
int cnt[MAXN + 5];//存储用户名出现的次数
int main(){
int n;
string s;
int num = 0;//记录输入的 不同的 用户名的数量
cin >> n;
for(int i = 1; i <= n; i++){
bool flag = 0;
cin >> s;
for(int j = 0; j < num; j++){
if(name[j] == s){
cnt[j]++;//找到相同的,记录+1
cout << s << cnt[j] << endl;
flag = 1;
break;
}
}
if(flag == 0){//未找到相同的,添加新记录再输出
name[num] = s;
num++;
cout << "OK" << endl;
}
}
return 0;
}