部分文字列を検索

https://loj.ac/problem/103

タイトル説明

  文字列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 ; 
}

 

おすすめ

転載: www.cnblogs.com/fangbozhen/p/11618425.html