タイトル説明
KMP文字列がメインの文字列のモード位置を求めて、メインの文字列と文字列のパターンで与えられ、学習アルゴリズム
参考のために以下のアルゴリズムの枠組み
エントリー
発現最初の入力T、Tのインスタンス
メインストリングの最初のインスタンスの2行目、パターン文字列の第三の例の最初の入力ラインに入ります
等々
輸出
次の値のパターン文字列の最初のインスタンスの最初のライン出力
出力位置整合が故障出力0に一致する、成功した場合に第一出力整合インスタンスの第2の行の位置は、位置計算から始まります
等々
サンプル入力
3 qwertyuiop TYU AABBCCDD CCC aaaabababac ABAC
サンプル出力
-1 0 0 5 -1 0 1 0 -1 0 0 1 8
プロンプト
なぜ同じ次の値と教科書???
書式#include <iostreamの> の#include < 文字列 > 使用して 名前空間はstdを、 INT * GETNEXT(列P) { int型 J = 0、K = - 1 。 int型 *次回= 新しい int型[p.size()]; 次の[ 0 ] = - 1 。 一方、(J <(INT)p.size() - 1 ) { もし(K == - 1 || P [j] == P [K]) { J ++ 。 K ++; 次の[J] = K。 } 他 K = 次の[K]。 } 戻り次。 } INT KMP(ストリング S、文字列P) { INT iは= 0、J = 0 。 int型 *次回= GETNEXT(P); 一方、(I <(INT)s.size()&& J <(INT )p.size()) { 場合(J == - 1 || S [I] == P [J]) { I ++ 。 J++ ; } そう J = 次の[J]。 } であれば(j ==(INT )p.size()) を返す I-J + 1 。 リターン 0 ; } int型のmain() { int型T。 CIN >> T; 一方、(T-- ) { ストリングS、P。 CIN >> S >> P; int型 *次回= GETNEXT(P); 以下のための(int型私は= 0を I <(; int型)p.size(); I ++ ) { COUT <<次の[I] << " " 。 } COUT << ENDL。 COUT << KMP(S、P)<< ENDL。 } 戻り 0 。 }