AT2395 [ARC071C] TrBBnsformBBtion(构造)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AT2395 [ARC071C] TrBBnsformBBtion(构造)相关的知识,希望对你有一定的参考价值。
发现操作是可逆的
①. A A A可以变为 B B BB BB, B B BB BB也能变为 A A A
B B − > A A A A − > A BB->AAAA->A BB−>AAAA−>A
②. A A A AAA AAA可以消除,同样如果存在一个 A A A那么可以创造 3 x + 1 3x+1 3x+1个 A A A
A − > B B − > A A B − > A A A A A->BB->AAB->AAAA A−>BB−>AAB−>AAAA
既然证明了操作可逆,那么可以同时对 S , T S,T S,T串进行变换也不影响结果
所以我们直接选择把 S S S中所有的字母 B B B变成 A A A
把串 T T T中的字母 B B B变成 A A A
那么现在 S S S串有 x x x个 A A A,而 T T T串有 y y y个 A A A
前面说到因为一个 A A A可以转化为 3 x + 1 3x+1 3x+1个 A A A
所以 A A A的个数是没有意义的,直接对 x , y x,y x,y模三判断是否相等即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
char a[maxn],b[maxn];
int pre1[maxn],pre2[maxn];
int main()
{
cin >> ( a+1 ) >> ( b+1 );
int n = strlen( a+1 ), m = strlen( b+1 );
for(int i=1;i<=n;i++) pre1[i] = ( pre1[i-1]+(a[i]=='A') );
for(int i=1;i<=m;i++) pre2[i] = ( pre2[i-1]+(b[i]=='A') );
int q; cin >> q;
while( q-- )
{
int l,r,q,w; scanf("%d%d%d%d",&l,&r,&q,&w);
int a1 = pre1[r]-pre1[l-1], b1 = r-l+1-a1;
a1 += 2*b1;
int a2 = pre2[w]-pre2[q-1], b2 = w-q+1-a2;
a2 += 2*b2;
if( a1%3==a2%3 ) printf("YES\\n");
else printf("NO\\n");
}
}
```
以上是关于AT2395 [ARC071C] TrBBnsformBBtion(构造)的主要内容,如果未能解决你的问题,请参考以下文章
[Arc068D/At2299] Card Eater - 结论