2019年6月合同訓練学校多層Bの2日目テスト問題A:AC

洪水の問題が、私は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 
}

 

おすすめ

転載: www.cnblogs.com/LJB666/p/10991357.html