JZOJ 1421バイナリツリー

タイトル

説明

  完全に無限のバイナリツリーでは、以下の特徴を有する:
  (1)各ノードは、二人の息子を持って-左と右の子息子;
  (2)ノード番号は、次にX、その左側の子の数である場合; 2X、右の子+ 2X 1の
  ルートノード番号1(3)。
  今ルートから行く、すべてのステップは、3つのオプションがあります。彼の息子を左折、彼の息子が右に行き、じっと。
  文字で「L」は、左の息子が行き示し、「R」は右の息子が来表し、「P」は明確なルートの3文字の文字列表現、代わりにストップを表します。
明確な経路の値は、5〜LR値、及び3にRPP値としてノードの最終的な数に到達します。
  我々は、文字「L」、「R」、使用 「P」 と「*」のルートのセットからなる文字列を表すが、ここで、「*」、「L」、「R」、のいずれであってもよい 「P」 で文字列マッチングルートを持つすべてのこれは実現可能であると考えられています。
  例えばL * Rは、LLR、LRRとLPRが含まれています。** LL、LR、LP、RL、含ま RR、RP、PL、PR 、およびPPこれら9つのルート。
  ルートパターンおよび値に一致するすべてのルートの和の設定値。与えられたルートの値を計算するためにプログラミングしてください。
 

入力

  のみ「L」、「R」、「P」と文字の「*」四種類10,000以下での長さが含まれているルートのセットを表す文字列を入力します。

出力

  ルートの出力値。
 

サンプル入力

入力1:
P * P 

入力2:
のL * R&LT 

入力3:
** 

。入力4:
LLLLLRRRRRLLLLLRRRRRLLLLLRRRRRLLLLL

サンプル出力

出力1:
6 

出力2:
25 

出力3:
33は、

出力4:
35400942560
 

データ制約

 
 

ヒント

[データ]の範囲
  フリーデータのスキームを満たすために、30%の「*」、
  データの50%は、「*。」3つだけの最大値を満たします

ソース/著者:COCI2008

分析

  •  
     3 ^ kの異なる数字で構成、k個の*番号の後とします。
    次は、L:2 *同時に各数値、2の即ち和*
    1 + 2 *同時の数の各々 、すなわち、(3 ^ K)*の数の合計2 + 1:次はRである *の
    次*ビットは:数kは、数3 ^ 3 ^(K + 1)となる
    数k ^ 3、1 *の和変化しない
    数k ^ L、2 *の和に加え、さらに3を
    も3プラス数k ^ R、1 + 2 *それぞれの数、*の数の和、すなわち2 + 1 *数(3 ^ k)を
    要約すると、和* 5 + 3 ^ K。
    プラス電荷ビット精度がなくなって。

 

コード

1の#include <iostreamの>
 2の#include <CStringの>
 3の#include <cstdioを>
 4  使って 名前空間STDを、
5  のconst  int型 N = 1E4 + 10、MO = 1E8。
6  チャーS [N]。
7  INT [N]、P [N] F。
8  長い 長い ANS = 0 9  ボイド MUL(INT X)
 10  {
 11      のためのint型 I = [F 0、I> =] 1 [I] * = xとF、[I + F; i--)1 ] + = F [I] / MO 、F [i]の%=MO;
12      であれば(F [F [ 0 ] + 1 ])F [ 0 ] ++ ;
13  } 
 14  ボイド()TMP
 15  {
 16      のためには、int型私は、pを= [ 0 ]; I> = 1 ; i--)P [I] * = 3、P [I + 1 ] + = P [I] / MO 、P [i]は%= MO。
17      もし(P [P [ 0 ] + 1 ])P [ 0 ] ++ ;
18  }
 19  空隙追加()
 20  {
 21      のためにINTi = 1 ; iは<は= MAX(P [ 0 ]、[F 0 ]); iは++)F [I] + = P [I]、F [iが+ 1 [I F] + = F [i]は/ MO、 】%= MO。
22      であれば(F [F [ 0 ] + 1 ])F [ 0 ] ++ ;
23  }
 24  のint main()の
 25  {
 26      INT LEN。
27の      CIN >> S + 1 ;
28      LEN =のSTRLEN(S + 1 )。
29      P [ 0 ] Pは= [ 1 ] = F [ 0 ] = F [ 1 ] = 1 30     以下のためにint型 i = 1 ; iは= LEN <; iは++ 31      {
 32          であれば(S [I] == ' L ')MUL(2 )。
33          他の 場合(S [I] == ' R ')MULは、(2 )、(追加)。
34          他の 場合(S [I] == ' * ')MUL(5 )、(ADD)、TMP()。 
35      }
 36      COUT << F [F [ 0 ]]。
37      のためにint型 I = F [ 0 - ] 1; I> = 1 ; i--)のprintf(" %の08D " ; F [i])と、
38 }

 

おすすめ

転載: www.cnblogs.com/zjzjzj/p/11100026.html