二つの文字列の実験データ構造:文字列照合(ハッシュ化された文字列)

問題の説明

二つの文字列と文字列2文字列1を考えると、string2のは、文字列1のサブ文字列かどうかを決定します。

入力

入力データが複数組を備え、テストデータの各セットは、2つの行で構成され、最初の行は、文字列1を表し、第二の行を文字列2、および文字列1文字列2スペースは起こらないことが保証されます。(文字列1と文字列2のサイズが100文字を超えていません)

出力

各場合について、文字列1の文字列2のサブストリングは、出力が「YES」、そうでなければ「NO」を出力する場合。

サンプル入力

ABC 123456 45 ABC DDD




サンプル出力

YES
YES
NOの

シングルハッシュ

#include <ビット/ STDC ++ H>
 の#defineがっ長い長い
typedefの符号なしの長い 長いULL。

使用して 名前空間はstdを、

CONST ULLの基地 = 131 

ULL MUL [ 1000010 ]。
ULLハッシュ[ 1000010 ]。

int型のmain(){ 
    IOS :: sync_with_stdio(); 
    MUL [ 0 ] = 1 以下のためにint型私= 1 ; iが< 110 ; I ++)はMUL [I] = MUL [I- 1 ] * 基地;
    文字列STR1、STR2。
    一方、(CIN >> STR1 >> STR2){
         int型 LEN1 = str1.size()。
        INT LEN2 = str2.size()。
        以下のためにint型 i = 0 ; I <LEN1; I ++ ){ 
            ハッシュ[I + 1 ] =ハッシュ[I] * 基底 + 0009 [I]。
        } 
        ULL和 = 0 以下のためにint型 i = 0 ; I <LEN2 iは++ ){ 
            合計 =合計* 基底 +と STR2 [I]。
        } 
        int型フラグ= 0 int型、L = 1、R = LEN2。
        一方、(R <= LEN1){ 
            ULLさt =ハッシュ[R] -ハッシュ[1- 1 ] * MUL [LEN2]。
            もし(T ==和)フラグ= 1 
            リットル ++、R ++ 
        } 
        であれば(フラグ)COUT << " YES " << ENDL。
        他の裁判所未満<< " NO " << てendl; 
    } 
    戻り 0 
}

ダブルハッシュ

#include <ビット/ STDC ++ H>
 の#defineは長い長いllの使用名前空間STDを、CONST LLのベース = 131 CONST LLのMOD1 = 1E9 + 7 CONST LLのMOD2 = 1E9 + 9 構造体ノード{ 
    LL、B。
}ハッシュ[ 1000010 ]。
[MUL1 LL 1000010 ]。
[MUL2 LL 1000010 ]。INT メイン(){
     文字列STR1、STR2。
    MUL1 [ 0 ] = 1 
    MUL2 [ 0 ] =

 






1 ;
    以下のためにint型 i = 1 ; iは< 1000010 ; iは++ ){ 
        MUL1 [I] = MUL1 [I- 1 ] * 基地%のMOD1。
        MUL2 [I] = MUL2 [I- 1 ] * 基地%のMOD2。
    } 
    一方(CIN >> STR1 >> STR2){ 
        LLのSUM1 = 0、SUM2 = 0 INT LEN1 = str1.size()。
        INT LEN2 = str2.size()。
        以下のためのint型私は=0 ; 私はLEN1を<; 私は++ ){ 
            ハッシュ[I + 1 ] .A =(ハッシュ[I] .A * 基底 + 0009 [I]%のMOD1)。
            ハッシュ[I + 1 ] .B =(ハッシュ[I] .B * 基地 + 0009 [I]%のMOD2)。
        } 
        のためにint型 i = 0 ; iは<LEN2; iは++ ){ 
            SUM1 =(SUM1 * 基底 + STR2 [I])%のMOD1。
            SUM2 =(SUM2 * 基地 + STR2 [I])%MOD2。
        } 
        int型の L = 1、R = LEN2。
        int型フラグ= 0 一方、(R <= LEN1){
             場合(SUM1 ==(((ハッシュ[R] .A -ハッシュ[1- 1 ] .A * MUL1 [LEN2]%のMOD1)%のMOD1 + MOD1)%のMOD1)&& 
               SUM2 = =(((ハッシュ[R] .B -ハッシュ[1- 1 ] .B * MUL2 [LEN2]%MOD2)%のMOD2 + MOD2)%のMOD2))
               フラグ = 1 
            リットル ++、R ++ 
        } 
        であれば(フラグ)COUT << " YES " << ENDL。
        他の裁判所未満<< " NO " << てendl;
    }     
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Stay-Online/p/11305637.html