タイトル説明
文字列Aを考えると、文字列B 、Bが求めているの出現回数を。A とB の英語の文字では、大文字または小文字です。
考え
もちろん、これは私のパス文字列のマッチング問題で、我々はKMPで解決することができます。文字列のハッシュ:しかし、ここで私は主に、より簡単な方法を紹介したいと思います。私たちは、16進数bの文字列として見ベースB、に行ってきました。できるだけ早く文字列の長さのハッシュ値を得るために、我々は、スクロールハッシュを使用することができます。このプロセスは、再帰を使用して完成させることができる:H(C、K + 1)H =(C、K)+ B * C K + 1。したがって、私たちは、n kは次式から始まる文字列の長さから算出したハッシュ値を見つけることができます。
H(C「)= H(C、K + N)-H(C、K)* bはN。
そして、ライン上で再びそれを行います。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの符号なしの長い 長いULL。 CONST ULLのB = 131 。 チャー S1 [ 1000005 ]、S2 [ 1000005 ]。 ULL電力[ 1000005 ]和[ 1000005 ]。 INT メイン() { scanf関数(" %sの%sの"、S1 + 1、S2 + 1 )。 電力[ 0 ] = 1 ; 以下のために(int型 = Iを1 ; iは< 1000000を; iは++ ) 電源を[i]を =電力[I- 1 ] * B。 INT、M = STRLEN(S1 + 1)、N = STRLEN(S2 + 1 )。 以下のために(int型私= 1 ; I <= M; iが++ ) 和[I] =和[I- 1 ] * B + S1 [i]は、 ULL S = 0、ANS = 0 。 以下のために(int型 i = 1 ; iが++; iが<= N ) S = sの* B + S2 [i]は、 以下のために(int型私は= 0 ; I <= MN; I ++) であれば(S ==和[I + N] -sum [I] *電力[N])ANS ++ 。 printf(" %のLLD " 、ANS)。 リターン 0 ; }