https://codeforces.com/contest/1672/problem/B
(结论构造场子啊)
input
4
AABAB
ABB
AAAAAAAAB
A
output
YES
NO
YES
NO
题意
给定一个仅由
A
A
A 与
B
B
B 构成字符串,判断是否能通过多次以下方法来使得一个空串构造出给定的字符串
- 在当前串的任意位置插入一个满足以下条件的字符串:由 k ∗ ‘ A ’ + ‘ B ’ k * ‘A’ + ‘B’ k∗‘A’+‘B’ 其中 k ≥ 1 k ≥ 1 k≥1 构成,即 A B 、 A A B 、 A A A B 、 A A A A B . . . AB、AAB、AAAB、AAAAB... AB、AAB、AAAB、AAAAB...
思路
在某个位置上加上
k
∗
‘
A
’
+
‘
B
’
k * ‘A’ + ‘B’
k∗‘A’+‘B’ ,
- 若是 k = = 1 k == 1 k==1 ,假定在这位置之前共有 x x x 个 A A A 与 y y y 个 B B B ,则加上去之后, x + 1 x+1 x+1 个 A A A 与 y + 1 y+1 y+1 个 B B B
- 若是 k = = 2 k == 2 k==2 ,假定在这位置之前共有 x x x 个 A A A 与 y y y 个 B B B ,则加上去之后, x + 2 x+2 x+2 个 A A A 与 y + 1 y+1 y+1 个 B B B
- 若是 k = = 3 k == 3 k==3 ,假定在这位置之前共有 x x x 个 A A A 与 y y y 个 B B B ,则加上去之后, x + 3 x+3 x+3 个 A A A 与 y + 1 y+1 y+1 个 B B B
- …
所以可以看出一个结论是:
在某个位置的前面 共有
x
x
x 个
A
A
A 与
y
y
y 个
B
B
B,则
x
≥
y
x ≥ y
x≥y,拿这个结论进行判断即可
以及,最后构造的串一定是以 B B B ,作为结尾的,最后特判一下
AC代码
#include <bits/stdc++.h>
#define endl '\n'
#define AC return 0;
using namespace std;
//#define ll long long
//#define int long long
void slove()
{
string s;
cin >> s;
int n = s.length();
int a = 0,b = 0;
for(auto i : s)
{
if(i == 'A') a++;
else b++;
if(b > a)
{
cout << "NO" << endl;
return;
}
}
if(s[n - 1] == 'A')
cout << "NO" << endl;
else
cout << "YES" << endl;
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T;cin >> T; while(T--)
slove();
AC
}