加賀一稿一記

心は戦国

ARC071E TrBBnsformBBtion

atcoder.jp
600埋め

問題概要
'A', 'B'からなる文字列SとTがある。(長さは10^5以下)
以下の置換操作を任意に行える。

  • "A" → "BB"
  • "B" → "AA"
  • "AAA" → ""
  • "BBB" → ""

クエリa, b, c, dがq回与えられる。(q<=10^5)
それぞれのクエリについて、Sのa文字目からb文字目までの文字列を、Tのc文字目からd文字目までの文字列に変換できるか求めよ。

考察
無理では????
と思いつつも文字列の遷移を書いていると、文字列に対する変換には逆変換が存在することが分かる。
"A" → "BB"なら"BB" → "AAAA" → "A"といった具合。
このことから、S, Tそれぞれを目標となる文字列sに変換できればYESなことが分かる。
また、"AAA" → ""に対して"" → "AAA"は通常不可能だが、置換処理の際に運用でカバーしてもらうので問題ない。
ここで、sは'A'のみで構成された最短の文字列とする。
'B'を全て"B" → "AA"で変換し、"AAA" → ""を可能な限り使うとsは"", "A", "AA"のいずれかになる。
これは区間の'A', 'B'それぞれの数から分かるので、累積和で簡単に求まる。
ので、S, Tそれぞれの区間から目標文字列の長さを調べ、一致するか判断する。

提出
→AC
やったぜ。