洪水の問題が、私はKMP試験を考えるとき
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E6 + 7 。 チャーS1 [MAXN]、S2 [MAXN]。 ブールFLAG1、FLAG2; INT [MAXN]失敗。 int型FAIL1 [MAXN]。 int型LEN1、LEN2。 チャー試験[MAXN]。 チャーTEST1 [MAXN]。 int型の須磨[MAXN]。 int型のSUMC [MAXN]。 int型のsum1a [MAXN]。 int型のsum1c [MAXN]。 int型ANS1、ANS2。 ボイドプレ() { [失敗1 ] = 0 。 失敗します[2 ] = 0 ; FAIL1 [ 1 ] = 0 ; FAIL1 [ 2 ] = 0 ; } ボイドkmp1() { int型 ANS = 0、J = 0 。 INT L1 = STRLEN(テスト+ 1 )。 以下のために(int型 I = 1 ; I <= LEN1; iは++ ) { 一方(J> 0 &&試験[J + 1 ] = S1の[I]!)J = [J]失敗。 もし(試験[J + 1 ] == S1 [i])とJ ++ 。 もし(J == L1) { ANS ++ 。 スマ[ANS] = I-L1 + 1 。 } } ANS1 = ANS。 } ボイドkmp2() { int型 ANS = 0、J = 0 。 INT L2 = STRLEN(TEST1 + 1 )。 用(int型 iは= 1 ; I <= LEN1; iが++ ) { ながら(J> 0 && TEST1 [J + 1 ] = S1 [i]が!)J = FAIL1 [J]。 もし(TEST1 [J +1 ] == S1 [i])とJ ++ 。 もし(jは== L2) { ANS ++ 。 sum1c [ANS] = I-L2 + 1 。 } } ANS2 = ANS。 } ブールチェック() { ため(int型 I = 1 ; I <= ANS1; iは++ ) { ための(int型 J = 1 ; J <= ANS2あり、j ++ ) { 場合(ABS(スマ[I] -sum1c [J]) > 1 ){ 戻り 真。 } } } を返す 偽。 } int型のmain() { 一方(scanf関数(" %sの"、S1 + 1)!= EOF) { memsetの(FAIL1、0、はsizeof (FAIL1))。 memsetの(失敗0、はsizeof (失敗))。 LEN1 = STRLEN(S1 + 1 )。 試験[ 1 ] = ' A ' 。 試験[ 2 ] = ' C '。 TEST1 [ 1 ] = ' C ' 。 TEST1 [ 2 ] = ' A ' 。 プレ()。 kmp1(); kmp2(); もし(チェック())のprintf(" YES \ nを" ); 他のprintf(" NO \ nを" ); } 戻り 0 。 }