ジッパーの法則
#include <CStringの> する#include <iostreamの> 使用して 名前空間STD; CONST INT N = 100003 ; INT H [N]、E [N]、NE [N]、IDX; ボイド INSERT(INT X){ int型 K =(X N + N%)%N; // ハッシュ関数 // シミュレーション単鎖 E [IDX] = X; // 生存する NEを[IDX] = H [K]; // 負に向かって1。 H [K] = ++ IDX; // 元のデジタルポイントIDX } BOOLの検索(INT X){ int型 K =(X + N%N)%N; のための(INT私は、h [k]を=。I = - !1。私は= NEは[i]は){ 場合(E [I] == x)を 返す 真。 } を返す 偽。 } int型のmain(){ int型のn; cinを >> N; memsetの(H、 - 1、はsizeof H)。 一方、(N-- ){ チャー OP [ 2 ]。 int型のx; CIN >> OP >> X; もし(* OP == ' I ' )のインサート(x)は、 他{ 場合(見つける(X))COUT << " はい" << ENDL。 他の裁判所未満<< " ノー" << てendl; } } 戻り 0 。 }
全仏オープンへの対処
#include <CStringの> する#include <iostreamの> 使用して 名前空間STD; CONST INT N = 200003、中国、ヌル = 0x3f3f3f3f ; INT H [N]; int型検索(INT X){ int型 T =(X + N%N)%N。// ハッシュ関数 一方(H [T] =!ヌル && H [T] = X!){ // ない場合はXを介して挿入される ++ T; // ダウン次いで見つける IF(T == N )T = 0 ; // ヘッド、スクラッチ見つける } 戻り Tを、//直到找到为止 } int型のmain(){ memsetの(H、0x3fを、はsizeof H)。 int型のn; scanf関数(" %のD "、&N) 一方、(N - ){ チャー OP [ 2 ]。 int型のx; scanf関数(" %sの%D "、OP、およびX) もし(* OP == ' I ')H [検索(X)= X。 他{ 場合(H [検索(X)] == NULL)プット(「ノー」 ;)// を通じて挿入されていない場合は 、他の(プット「はい」); } } を返す 0 ; }