QQは、新しいアカウントのアプリケーションや古いアカウントのログイン機能の簡易版を達成します。最大の課題は次のとおりです。QQの番号は10桁の数字を持っていると言われています。
入力フォーマット:
まず、入力は、正の整数N(≤)、その後得られるN行の命令を。各コマンドのフォーマットは次のとおりです。「コマンド(空白)QQ番号(空白)パスワード。」ログイン情報を踏襲し、表現が古いアカウントのログインのとき(ログインの代わりに)「L」にコマンド記号、彼は文字が(新に代わって)「N」であるコマンド新しい口座番号とパスワードが続くQQ、新しいアプリケーションの数であると言われ。QQ番号が10以下であるが、1000以上の整数(ボスQQ番号1001前記しました)。パスワードは、文字列にはスペースが含まれていない、せいぜい16 6以上ではありません。
出力フォーマット:
各命令のために、対応する情報が与えられます。
新しいアプリケーションのアカウントが成功した場合は1)、出力「新:OKは」;
2)数は、新しいアプリケーションはすでに、出力「エラー:存在し、」存在している場合;
3)古いアカウントでのログインが成功すると、出力「ログイン:OK」;
4)古いQQ口座番号が存在しない場合は、出力が「エラー:存在しません」;
5)古いアカウントのパスワードが間違っている場合、出力「ERROR:間違ったPWを」。
サンプル入力:
5
L 1234567890 [email protected]
N 1234567890 [email protected]
N 1234567890 [email protected]
L 1234567890 myQQ@qq
L 1234567890 [email protected]
出力例:
ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
この週末の事は少しくらいですので、このブログはまた、我々はそれのQQのアカウントのアプリケーション上で自分の考えを書くことを考え、いくつかの性急を書きました。
まず、私はこの質問は実際には非常に簡単であるかの分析を開始したこの質問を見た、それはオブジェクトのアイデンティティに基づいて、すべての最初の決定する単純な比較、あること、パスワードが正しいかどうかを決定することがあれば、そこにあるか否かが判断され、古いアカウントです。新規ユーザーの場合は、それにあったか否かを判断します。だから私は、データの問題の量を考慮し、シンプルで比較的単純なデータ型の文字列を使用しないように始めました。しかし、間違いなく、あなたは確かではありませんので、私はマップを使用することでそれに言及しました。簡単に言えばマップは、コンテナに接続されているキーワードと値を提供することです。例を見てください:
enumMap [2] = "つ"。
あなたは、アイテム2用enumMap主キーを初めて目に2を挿入見つけ、その後、新しいオブジェクトenumMapを挿入していない場合は、キーが2で、値が空の文字列で、文字列が完成挿入され、「二」に割り当てられます。この方法は、各値がデフォルトODE、次に割り当てられた値を表示します。私たちは、find関数find()でマップを見たときに、関数はマップの末尾を指すイテレータを返す。見つからない場合は、重要な要素にキーを指すイテレータを返す使用しています。
マップ<整数、文字列> ::イテレータl_it ;;
l_it = maplive.find(112)。
もし(l_it == maplive.end())
coutの<< <<てendl「我々は112を見つけることができません」。
他の裁判所未満<<「112見つけヲ」 <<てendlを、
あなたが求める問題を解決することができるマップ機能を使用しています。
#include <iostreamの> する#include <地図> 使用して 名前空間STD; typedefは構造体 { // それぞれの定義アカウント情報QQ 列 NUM; // 10桁のアカウント番号QQので 文字列PS; } QQ、 QQ A [ 100005 ]; INT メイン() { 地図 < 文字列、文字列 > COM; // 関連するアカウントとパスワードの int型のn; CIN >> N-; CHAR レベル; のために(int型 I = 0を、私はN- <; I ++) { // 個別入出力 CIN >> レベル; IF(レベル== ' N ' ) { // 場合、新しいユーザ >> A [I] .num CIN >> A [I] .PS; IF( com.find(A [I] .num)== com.end()) { // 存在しないアカウントを分析 [A [I]は.num] = A [I] COM .PS; // 新しいアカウントとパスワード関連する 裁判所未満<< 「新:OK 」 << てendl; } 他 { // 新しいユーザーアカウントを分析するには、すでに存在している coutのを<<"ERROR:存在しA " << てendl; } } 他の IF(レベル== ' L ' ) { // もし古いユーザー CIN >> A [I] .num >> A [I]は.ps; IF(com.find ([I] .num)== com.end()) { // 古いユーザーが存在しない場合、 COUT << " ERROR:存在しない" << てendlを; } 他に { // パスワードは、アカウントに関連付けられている場合パスワード等しい IF([A [I] .num] COM == A [I] .PS) COUT <<" ログイン:OK " << ENDL; 他の COUT << " ERROR:間違ったPW " <<てendl; // パスワードが同じではありません } } } の戻り 0 ; }
第VII章について、私たちは、線形ルックアップテーブル、バイナリ検索に基づいてセンチネル方法があり、関連する知識を見つけることについて学びました。探索木のテーブル、最初のバイナリソートツリーをよれば、範囲は、B +ツリーの導入を探す達成するために、データの問題の量とBツリーの導入を解決するために、それは平衡二分木引用ツリー時間効率バイナリソートの問題を解決します。第二の問題は、ハッシュテーブルの大部分を見つけることであり、ハッシュテーブルの特性は、関連するレコードに関連するキーワードの格納場所であり、この方法は、正方形にとるハッシュ関数を使用する、デジタル解析のハッシュ関数構築方法であってチェーンアドレス法は学校の前に構造を使用することである。しかしなど、最も一般的に使用される方法は、加えて私は、線形探査方法、第二の検出方法、擬似ランダム検出方法のオープンアドレス法であり紛争の和解の時に、じっとデータ構造体の配列。
練習の大半は前の章ではあまり、私は研究の次の章では、練習に多くの時間を持つことが願っています。