#include <iostreamの> 使用して名前空間STD; のconst int型 N = 10010、M = 100010 ; INT N-、M; CHAR P [N]、S [M]; INT NE [N]; int型のmain() { CIN >> N- >> P + 1 >> M >> Sの+ 1 ; // 次見つける:短いアレイのために(INT I = 2、J = 0 ; I <= N; I ++は) { 一方(J && P [I] = P! [+ J 1。 ])J = NE [J]; // マッチしない、短いマッチの配列の前縁の同じ位置から開始IF(P [I] == P [J + 1 ])J ++ 。 NEの[i]を = J; } // KMP匹配 ため(INT I = 1、J = 0 ; I <= M; iは++ ) { 一方(J && S [I] = P [J +!1 ])J = NE [J]。 もし(S [I] == P [J + 1 ])J ++ 。 もし(jは== nの)// 匹配成功 { COUT << <<で' ' 。 J = NE [J]。 } } 戻り 0 。 }
同じ文字列マッチングを減らすことによって最適化されます
フォーカスが探している次のアレイ上にあります
jは:配列が小さい場合、マッチング処理が行われ、比較は、J + 1、J + 1も同じである同一位置jを交換しないとき、すなわち、次の対応する値を小さなフロント配列整合を有します。