noip11文字列

この質問は、私は暴力の形而上学の問題の複雑さ、および最短時間の成功、最小メモリを変更するために呼び出されたときに、私は成功したデータのセットを構築し、その後、独自のコードをオフにハックです。

観察を通じて、我々は簡単操作で複数回を見つけることができ、全体のシーケンスは、同じ文字の一部となります。

バケツの中への手紙ではなく、プラグ内部を見るのではなく、バケツにO(1)の連続した範囲:だから私たちは私たちの暴力のいくつかの最適化を行うことができます。

実装は非常に簡単です:各操作の後、各ブロックはオフrは、ブロックはLが含まれている場合の注意に入り、左右のエンドポイントを保存することができ、ACは不快と高速なコードの実行に発射することができます。

とにかく(ブロックは、2つのブロックが境界線の暴力を見つける必要がある境界は、特に大規模なブロック場合は、それぞれが探して、R取扱いリットルその後、O(n)と幸せなTされています。しかし、問題があります私は)10万6Sの実行を作りました

超高速添付ACコード:

1つの#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3インライン長い 長い読み取り()
 4  {
 5      INT X = 0、F = 1 6      チャー CH = GETCHAR()。
7      一方(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();}
 8      しばらく(CH> = ' 0 ' && CH <=' 9 ')x =(x << 3)+(X << 1)+ CH- ' 0 '、CH = GETCHAR()。
9      リターンのx *のF。
10  }
 11  int型 N、M、予め[ 100005 ]、LA、トング[ 27 ]、[ 100005 ]、NE [ 100005 ]、合計を、
12の チャー S [ 100005 ]。
13  のint main()の
 14  {
 15      N =(読み取り)、M = (読み取り)
16の      CIN >> S + 1 17      のmemset(、 -1はsizeof (a)参照)。
18      ラ= 1、[ 1 ] = Sは、[ 1 ] - [ A ' 19      のためにint型 I = 2 ; iが<= N; iが++ 20          であれば(S [I] == S [I- 1 ])
 21              NE [I] = 0 ;
22          他の NE [ラ] = I- 1、ラ= I、[I] = sの[I] - [ A ' 23      NE [ラ] = N。
24      のためにINT KK = 1; KK <= M; KK ++ 25      {
 26          のint L = read()は、R =リード()、X = )(読み取り、LAA。
27          であれば(NE [R +!1 ] && R =!N)
 28              のためのINT I = R; I; i-- 29                  であれば(NE [I])
 30                  {
 31                      NE [R + 1 ] =のNE [I]。
32                      [R + 1 ] = [I]。
33                      NE [I] = R。
34                      ブレーク;
35                  }
 36          のInt I = 1; I; i-- 37              であれば(NE [I])
 38              {
 39                  神聖NE = [I] + 1 40                  巨大[I]ヤラムの= リットル;
41                  場合(I = L!)NEの[I] = L 1 42                  ブレーク;
43              }
 44          スクランブル(神聖<= r)は
 45          {
 46              トン[神聖] + =分(NE [神聖]、R)-laa + 1 47              INT NEX = 分(NE [神聖]、R)。
48              NE [神聖] = 0[LAA] = - 1、LAA = NEX + 1 49          }
 50          であれば(x == 0 51              のためのINT I = 25 ; I> = 0 ; i-- 52                  であれば(トング[I])
 53                  {
 54                      [L] = I。
55                      NE [L] = 1 +トング[I] - 1 56                      L + = トング[I]。
57                      トン[I] = 0 ;
58                  }
 59          もし(x == 1 60              のためのINT i = 0 ; iは= < 25 ; iは++ 61                  であれば(トング[I])
 62                  {
 63                      [L] = I。
64                      NE [L] = 1 +トング[I] - 1 65                      L + = トング[I]。
66                      トン[I] = 0 ;
67                  }
 68      }
 69      のためのint型 i = 1 ; iが<= N; iが++ 70     {
 71          場合([I] == -は1 72は[I] = [I- 1 ]。
73          のputchar([I] + ' A ' );
74      }
 75の      プット("" )。
76      リターン 0 ;
77 }
1.4K 766msAC

 

おすすめ

転載: www.cnblogs.com/hzoi-cbx/p/11285466.html