ああ...
トピックリンクします。https://www.luogu.org/problemnew/show/CF804B
この質問は何のスキルではありません、ただ法律問題を見つけます。
まず、「AB」は「BBA」に置き換えることができます参照して、私たちが最初に逆列挙(s_0開始から注複数可)を決定する必要があり、あなたが発生した場合、あなたはそれを変更することができますので、回数、ANS + = CNTBを置くことですBバックナンバー、×2 CNTBの数が、ABはまた、2件のトランスデューサのB B BBAとして変更することができます。あなたはB、直接CNTB ++が発生した場合は、別の操作を必要としません。
注意:modはいつでも死ぬことができる、それが最終的な結果には影響しません。
ACコード:
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <CStringの> 4 5 使用 名前空間STD。 6 7 のconst int型 MOD = 1E9 + 7 。 8 チャー S [ 1000005 ]。 9 長い 長いANS、CNTB。 10 11 INT メイン(){ 12 のscanf(" %sの" 、S); 13 INT LEN =のSTRLEN(S) 14 のために(int型 - I = LEN 1; I> = 0 ; i-- ){ 15 であれば(S [I] == ' A ' ){ 16 (ANS + = CNTB)%= MOD。 17 (CNTB * = 2)%= MOD。 18 } 19 他 ++ CNTB 。 20 } 21 のprintf(" %LLDする\ n "、ANS%のMOD)。 22 リターン 0 ; 23 }