[アルゴリズムの説明] KMP&EXKMP

KMP

KMPのよく知られているようなアルゴリズムに一致する文字列 - この記事の前半。

次のアレイ、および読者の目的を説明するために探しています。

 

まずコード投げるluoguP3375 KMP文字列マッチング[テンプレート]

書式#include <iostreamの> 
の#include <CStringの>
 使用して 名前空間はstdを、
const  int型 N = 5000002 ;
INT 次の[N]。
文字列S1、S2;
無効(INITをストリングS){
   ためint型 I = 0、J =次の[ 0 ] = - 1、LEN = s.size(); iが< LEN;){
     場合(J == - 1 || S [I ] == S [J])
        次の[ ++ I] = ++ J。
    他の J = 次の[J]。
  } 
} 
int型{main()の
    CIN >> S1 >> S2; 
    INIT(S2)。
    以下のためにint型 I = 0、J = 0、LEN = s1.size(); iが< LEN;){
         場合(J == - 1 || S 1 [I] == S2 [J])
             ++ iが、+ + J;
        他の J = 次の[J]。
        もし(J == s2.size())COUT << I-s2.size()+ 1 << ENDL。
    } のためにint型 I = 1、LEN = s2.size(); iがLEN = <; ++ I)
        COUT <<次の[I] << "  " リターン 0 ; 
}

 

 

のは、初期化初期化機能を見てみましょう。

無効(INITをストリングS){
   ためint型 I = 0、J =次の[ 0 ] = - 1、LEN = s.size(); iが< LEN;){
     場合(J == - 1 || S [I ] == S [J])
        次の[ ++ I] = ++ J。
    他の J = 次の[J]。
  } 
}

もちろん、OKも書かれている間

 

まず、〔I〕アレイが0のストリングを指す次〜I S最長プレフィックス実数部分は、接尾語の真の長さに等しいです。

少し周り。

真フロント/サフィックス:すなわち、元の文字列は、フロント/サフィックスに含まれていません。

 

このような真のプレフィックスABCABあり、AB、ABC、ABCA

真B、AB、CAB、BCAB接尾辞

 

マッチングプロセスに存在する場合ので

 

i、jは〜現在の処理間隔が0を表し、I、接頭辞と接尾辞Jの長さ、すなわち、接頭辞0〜J-1、添え字i-J + 1〜Iを決定します

実際には、プロセスは自分の試合です。

 

おすすめ

転載: www.cnblogs.com/lsy263/p/11516623.html