問題の説明
二つの文字列と文字列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 。 }