XS学校の化学競技のコーチは炉スラグの好き人々のグループです。
その日、彼は二回同級生に連続ポイントを命名して、ちょうど主要な食事を渡すことが、その後欧拉欧拉欧プル(詳細については、ゲームがCON900を終了した参照を)発見された側の間、彼は炉スラグをこするでしょう。
その後の主要な任務は毎日彼の出席を記録するために、探偵としてあなたを任命しました。プリンシパルが提供され、学生の化学競技リストの数、そしてあなたは彼が何ポイント間違った名前を持たない会長に伝える必要があります。(なぜだけではなく、彼は囲炉裏をプレイしましょう。)
最初の行整数n、クラスの人数。次のn行、それぞれが(もはやなく、互いに異なる、及び小文字のみを含む名前の文字列表現を行ない50)。+のN- 2整数mのライン、報告された監督の名前を表します。続いて行をM、各列は、(小文字のみを含有し、そして長さが超えていないパケットのコーチの列の名前を表す50)。
各コーチの名前については、出力ラインを報告しました。名前が正しく、初めての場合名前が初めて正しいが、ない場合は、出力は「OK」、エラーの名前、出力「WRONG」場合は、出力は「REPEAT」。(未引用符で)
5 まで のB 、Cの Dの ACD 3 にする こと
OK
REPEATの
WRONG
以下のための40データの%、N≤ 1000年、M個の≤ 2000 ; のための70のデータの%、N≤ 10000、M≤ 20000 ; 用の100、N≤データの%10000 ≤、M 100000。
トライ木水の問題。。。。。
小さな配列を開くために始めて、それはトライが爆発書き込みだと思いました
そして、ビット配列のサイズを変更する考えを保持してみてください
その後、AC。。。
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <地図> 使用して名前空間STD; 地図 < 文字列、整数 > フラグには、 int型 [トライを1000100 ] [ 51である;] ストリング S; // 使用して文字入力文字列のint TOT = 0 ; // 現在の数ボイドINSERT() { int型 LEN = s.length(); int型ルート= 0 ; のための(INT I = 0 ;私はLEN <; I)が++ // 順番に配置された { int型の ID =のS [I] - [ A ' ; IF!(トライ[ルート] [ID])// このノードに存在しない { トライ[ルート] [ID] ++ TOT =; // 配置され、数字 } ルート =トライ[ルート] [ID]; // その後、ダウン探し続け } } BOOLの検索() { int型 LEN = s.length(); INTルート= 0 ; のため(int型 I = 0 ; S [I]; I ++は) { INT X = S [I] - [ A ' ; IF (トライ[ルート] [X]) { ルート =トライ[ルート] [X]; // このノード、すなわち一致した } 他の リターン falseにします ; / / 直接結合していないが終了 } 戻り trueに ; //が一致を } int型のmain() { int型N-、 CINを >> N-; のための(INT I = 1 ; I <= N-Iが++ ) { CIN >> S。 INSERT(); } int型のM; CIN >> M; のための(INT I = 1 ; I <= M、Iが++ ) { CIN >> S; IF((検索)&&フラグに[S] == 0)// 相手に初めて { フラグ[S]で = 1 ; COUT << " OK " << てendl; } 他の IF(!でフラグ[S] = 0&()して下さい)// 一致ではなく、最初の時間を { 裁判所未満<< " REPEAT " << てendl; } 他// 没有匹配上 { COUT << " 間違い" << ENDL。 } } 戻り 0 。 }