P12341 [蓝桥杯 2025 省 A/Python B 第二场] 消消乐

题目描述
小蓝正在玩一个叫"一维消消乐"的游戏。游戏初始时给出一个长度为 n n n 的字符串 S = S 0 S 1 ... S n − 1 S = S_0S_1\ldots S_{n-1} S=S0S1...Sn−1,字符串只包含字符 A \text{A} A 和 B \text{B} B。小蓝可以对这个字符串进行若干次操作,每次操作可以选择两个下标 i , j ∈ [ 0 , n − 1 ] i, j \in [0, n-1] i,j∈[0,n−1],如果 i < j i < j i<j 且 S i = A S_i = \text{A} Si=A 且 S j = B S_j = \text{B} Sj=B,小蓝就可以把它们同时消掉。小蓝想知道在经过若干次操作后,直到无法对字符串继续进行操作时,字符串最多剩下多少个字符。
输入格式
输入一行包含一个长度为 n n n 的字符串 S S S。
输出格式
输出一行包含一个整数表示答案。
输入输出样例 #1
输入 #1
BABAABBA
输出 #1
4
说明/提示
样例说明
先消掉 ( S 1 , S 6 ) (S_1, S_6) (S1,S6),再消掉 ( S 4 , S 5 ) (S_4, S_5) (S4,S5),此时剩下 BBAA \text{BBAA} BBAA,无法继续进行操作。
评测用例规模与约定
- 对于 10 % 10\% 10% 的评测用例, 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20;
- 对于 20 % 20\% 20% 的评测用例, 1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100;
- 对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 10000 1 \leq n \leq 10000 1≤n≤10000;
- 对于所有评测用例, 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1≤n≤106。
写在前面
可能是最后一舞了
思路
很容易看出来是双指针,然后一直模拟即可
代码
C++
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
string s;
cin>>s;
int cnt=0;
for(int i=0,j=s.size()-1;i<j;){
if(s[i]=='A'&&s[j]=='B'){
i++;
j--;
cnt++;
}
else if(s[i]=='A'){
while(i<j&&s[j]!='B'){
j--;
}
if(j>i){
i++;
j--;
cnt++;
}
}
else if(s[j]=='B'){
while(i<j&&s[i]!='A'){
i++;
}
if(j>i){
i++;
j--;
cnt++;
}
}
else{
i++;
j--;
}
}
cout<<s.size()-2*cnt;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}