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を決定します
実際には、プロセスは自分の試合です。