AT2395 [ARC071C] TrBBnsformBBtion(构造)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AT2395 [ARC071C] TrBBnsformBBtion(构造)相关的知识,希望对你有一定的参考价值。

LINK

发现操作是可逆的

①. 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 - 结论

AT4108 [ARC094D] Normalization

AT2582 [ARC075D] Mirrored

题解 AT3875 [ARC089A] Traveling

AT2272 [ARC066B] Xor Sum 题解

AT2272 [ARC066B] Xor Sum 题解