教育Codeforcesラウンド78 A、B

リンク:https://codeforces.com/contest/1278


A:シャッフルハッシュ


問題の意味:その後、pの文字列は「ハッシュ」操作を実行することができる、最初のp要素に(おそらく無傷の)ランダムに配置され、そして、組成物、Pの前後で(空である)2つの文字列を追加しました新しい文字列は、時間と呼ばれます。P及びH入力文字列か否かを出力H pはハッシュ演算を介して導出されてもよいです。

    例えば:P = "abacaba"、H = "zyxaabcaabkjh" を入力し出力YES

分析:①②フロントとリア、それぞれ、Pプラス文字列の二つの新しい文字列内の要素のランダム順列P:ハッシュ演算を2つの段階に分けられます。最初の操作は、P、Pで表さあれば後の最初のように、「pが明確に現れる要素とpの数は、」に等しいです。したがって、検出回数は、各配列要素が発生する可能性がカウント前記ランダム配列から別の列を使用することができるPか否かを検出します。次に、②pは「サブストリングhの連続したストリング、音符PLEN長Pであり、hはHLENされ、それは我々がビット0ビットHLEN-PLENまで、最初から時間を横切ることができる、PLENの長さでありますpがランダムに配置されているかどうかから長PLENのサブストリングを開始します。

コード:

書式#include <iostreamの> 
の#include < 文字列 > 
の#include <CStringの>
 使用して 名前空間はstdを、

INT CNT [ 30 ]。
INT のmain()
{ 
    int型 T; CIN >> T。
    一方、(T-- 
    { 
        文字列 P、H; CIN >> P >> H。
        INT PLEN = p.length()、HLEN = h.length()。
        INT OK = - 1 ;
        以下のためにINT iは= 0 ; iが<= HLEN - PLEN; ++ I)
        {
            memset(CNT、  0はsizeof (CNT))。
            ストリング TMP = h.substr(I、PLEN)。
            INT J = 0 ; J <PLEN; ++ j)は
            {
                 ++ CNT [TMP [J] - ' ' ]。
                --cnt [P [J] - ' ' ]。
            } 
            OK = 1 以下のためにINT iが= 0 ; I < 30 ; ++ I)
            { 場合(CNTを[I] =!0
                
                {
                    OK = 0 ;
                    休憩; 
                } 
            } 
            もし(OK == 1 ブレーク
        } 
        であれば(OK == 1 
            COUT << " YES \ n " 他の
            裁判所未満 << " NO \ N " ; 
    } 
    戻り 0 
}

B:AとB


質問の意味:二つの変数、Bを考えます。各時間選択した番号を介し、実行操作:私は、ステップaとbの最小数を見つけ、(iは現在のステップのi番目の実行を=)この番号を追加は等しくすることができます。

分析:二つの数aとbのための操作をn回、行った後、増加は一般DSUM = N(N + 1)/ 2です。あなたは全体的な増加に適用すると、aとbが単一体の二つの数字であればしかし、それはあなたが最初のステップを知ることができないため、またはb増加を増加させることであり、非常に複雑になります。したがって、Bの全体として我々、およびそれらの元々cursum = A + B、N操作が行わはcursum + DSUM = A '+ B'(ここでA 'になった後== B ')、その後、あなたは重要なメッセージ得ることができます:この時間Aのでcursum + DSUM' を、その後cursum + DSUMは2の倍数でなければならない、== b」が、それ以外の場合は真実ではない、そして第二に、(cursum + DSUM)/ 2それしなければならない> =(a、b)はケースの極端な側が非常に小さいと、小さな側に追加されているので、右側の最後の値がIF(cursum + DSUM)、大きいと等しい最大/ 2が満たされていない> =最大(a、b)は、その後数は既に2の倍数が、この時点で適用されるが、十分ではないので、2つの半体およびBはこの時点で等しいこと。

コード:

書式#include <iostreamの> 
の#include <アルゴリズム> 使用して名前空間はstdを、INT のmain()
{ int型 T; CIN >> T。
    一方、(T-- 
    { int型 A、B、CIN >> B。
        もし(== B)
        { 
            COUT << 0 << ENDL。
            続け; 
        } INT cursum = A + B、N = 1、nsum = 0 (; N <= MAX(A、B)* 2 ; ++ N)

 


    
        
         
        {
            nsum + = N。
            もし(((cursum + nsum)&1)== 0 &&((cursum + nsum)/ 2)> = MAX(A、B))
            { 
                COUT << N << ENDL。
                休憩; 
            } 
        } 
    } 
}



おすすめ

転載: www.cnblogs.com/HotPants/p/12074778.html