質問の意味:
のみ得られたを含む数値文字列を入力ストリング300の数の倍数である(そう計算0,00,000異なる位置、及び先行ゼロの場合を考えます)。
サンプル入力:
600
123000321013200987000789
サンプル出力:
4
55
ソリューション:
O(n)のアプローチ:、プレフィックスと3つ以上の合計、NUMの統計合計数[合計]を取るしようとしている、再び反復経験をベースと次の0、統計が追加する前に番号を入れて、最後に追加一人で数0。
O(300N)DPの実践:以下
公式ソリューション:
コード:
O(N)、次
/ * 6msの* /
1の#include <ビット/ STDC ++ H> 2のtypedef 長い 長LL。 3 使用して 名前空間はstdを、 4 のconst int型 M = 1E5 + 5 。 5 チャーS [M]。 6 INT メイン() 7 { 8 ながら(〜のscanf(" %sの"、S + 1 )) 9 { 10 INT LEN = STRLEN(S + 1)、和= 0、NUM [ 3 ] = {}; 11 LLのCNT =0 ; 12 NUM [ 0 ] = 1 。 13 のためには、(int型 i = 1 ; iは= LEN <; iは++ ){ 14 合計は=(和+(S [I] - ' 0 '))%3 。 15 であれば(S [I] == ' 0 ' && S [I + 1 ] == ' 0 ' ){ 16 、CNT + = NUM [和]。 17 } 18 であれば(S [I] == ' 0 ')CNT ++ 。 19 NUM [合計] ++ ; 20 } 21 のprintf(" %LLDする\ n " 、CNT)。 22 } 23 リターン 0 。 24 }
[O(300N)]を次のようにDPのアプローチです。
/ * 224ms * /
1の#include <ビット/ STDC ++ H> 2のtypedef 長い 長LL。 3 使用して 名前空間はstdを、 4 のconst int型 M = 1E5 + 5 。 5 チャーS [M]。 6 INTの DP [M] [ 302 ]。 7 INT )(メイン 8 { 9 ながら(〜のscanf(" %sの"、S + 1 )) 10 { 11 のmemset(DP、0、はsizeof (DP))。 12 DP [ 1 ] [S [ 1 ] - ' 0 ' ] = 1 。 13 INT LEN =のSTRLEN(S + 1 )。 14 のために(int型 I = 2 ; iがLEN = <; Iは++ ){ 15 、DP [I] [S [I] - ' 0 ' ] ++ ; 16 のための(int型 J = 0 ; J < 300 ; J ++ ){ 17 のintフラグ=(J * 10の + S [I] - ' 0 ')%300 。 18 DP [I] [フラグ] + = DP [I- 1 ] [J]。 19 } 20 } 21 LL ANS = 0 。 22 のために(int型 i = 1 ; iがLEN = <Iは++ ) 23 ANS + = DP [I] [ 0 ]。 24 のprintf(" %LLDする\ n " 、ANS)。 25 } 26 リターン 0 。 27 }