sdutトライ

トライ

説明

単語は小文字であると仮定して、?辞書ああ、n個が知られている辞書の単語を行う方法がわからない単語に遭遇します。M既存の単語が辞書にm個の単語が表示されますを聞いて、分かりません。

入力

テストケースの複数のセットが含まれています。

最初の入力ラインN、M(N> = 0 && N <= 100000 && M> = 0 && M <= 100000)は、クエリに辞書とnはm個の単語の言葉で存在します。

n行続いて、辞書内の単語の存在を表します。

そして、ラインm、クエリの言葉にメートル

N = 0 && m = 0のルーチンを終了します

すべてのデータの単語がすべて小文字ではなく、10以上の長さであることを確認するために、

出力

出力はいがある場合は、何も出力番号はありません

サンプル

入力 

3 2

AAB

AA

広告

交流

広告

0 0

 

 

 

 

 

 

出力

番号

はい

 

 

 

 

フリー走行などして、リストを追加

#include <ビット/ STDC ++ H.> 使用して名前空間STD;
 CHAR S [ 20である];
 int型トライ[ 500010 ] [ 26である ];         // 配列は、オープン形而上、大きなTLE小さいRTEのあるINTの CC [ 500010 ];         // これは、単語が存在することを証明するために使用されるintを F = 1。; ボイドin_sertを(){
     int型 K = strlenを(S);
     INT P = 0 ;
     のためのINT I = 0、I <K; I ++ ){
         int型 C = S [I] - A

 



" ;
         IF(!トライ[P-] [C]){ 
            memsetの(トライ[F]、0はsizeof(トライ[F]));         //は、再初期化時に使用することができ、いくつかの時間を節約することができるはずですか?
            トライ[P] [C] = F; 
            F ++ ; 
        } 
        P =トライ[P] [C];     // 格納場所の隣に文字pポイント
    } 
    CC [P] = 1 ;     // 終了でタグワード
} 

BOOLのse_arch(){
     int型 K = (S)strlenを、
     INT P = 0 ;
     のためのINT= I 0、I <K; I ++ ){
         int型 C = S [I] - [ A ' ;
         IF(トライ[P] [C] == 0戻り 0 ;     //は、次の文字を説明は、の終わり木ありません 
        = P トライ[P] [C]; 
    } 
    IF(CC [P]!)戻り 0 ;         // ツリーでは、完全な単語、例えば、AAAツリーを保存、クエリAAではない
    他の 復帰 1。; 
} 

int型のmain()
{ 
    INT N-、M;
     ながら(〜scanfの(" %D%D " &&)、およびN-、&M(N- ||M)){ 
        GETCHAR(); 
        のmemset(トライ[ 0 ]、0はsizeof(トライ[ 0 ])); 
        のmemset(CC、0はsizeof (CC)); 
        Fは = 1 ;     // 格納された文字を表示するため位置
        一方(N-- ){ 
            scanfの(" %のS " 、S); 
            in_sert(); 
        } 
        ながら(M-- ){ 
            scanfの(" %のS " 、S);
             INT T = se_arch()。
            もし(T)のprintf(" はい\ N " );
            のprintf(" ノー\ N " ); 
        } 
    } 
    戻り 0 
}

 

 

#include <ビット/ STDC ++ H.>
使用して名前空間STD; CHAR S [20である]; int型トライ[500010] [26である]; //オープン配列は形而上、大きなTLE小さいRTEintのCC [500010]である; //と。; F = 1のint型単語を証明することは存在
' - {int型C = S [I](S)strlenを空隙in_sert(){int型K =; INT P = 0;のため(I ++ INT Iは= 0; I <K) A「;場合(トライ[P ] [C]!){memsetの(トライ[F]、0、はsizeof(トライ[F])); // 再初期化時に使用することができ、いくつかの時間を節約することができるはずですか?トライ[P]、[C] = F; F ++;} p =トライ[P]、[C]; // P点の文字の記憶場所へ} CC [P] = 1; // 終了}でタグワード
BOOL se_arch (){int型K = strlenを( S); INT P = 0;のために(INT iが0 =; I <K; I ++){int型、C = S [i]が' - '; IF(トライ[P] [C ] == 0)戻り0; //ツリー内の次の文字が記載されていない、P =トライ[P] [Cの終わり ];}(CC [P]であれば)戻り0 ;! // ツリー内が完了単語ではありません、そのようなAAA格納された木のような、他のクエリAAリターン1;}
メイン(){int型のn、mはint型。一方、(〜のscanf( "%D%D"、&N、&M)&&(N || M)){GETCHAR()。memsetの(トライ[0]、0、はsizeof(トライ[0])); memset(CC、0、はsizeof(CC))。F = 1; //用来指示字母保存的位置ながら(N - ){scanf関数( "%s" は、単数または複数); インサート(); }(M - )、一方{scanf関数( "%s" は、単数または複数); INT T = se_arch()。もし(T)のprintf( "はい\ N"); 他のprintf( "いいえ\ N"); }} 0を返します;}

おすすめ

転載: www.cnblogs.com/kaito77/p/12323007.html