【每日算法】 洛谷 P12341 【[蓝桥杯 2025 省 A/Python B 第二场] 消消乐】 2025.10.26
P12341 [蓝桥杯 2025 省 A/Python B 第二场] 消消乐

题目描述
小蓝正在玩一个叫“一维消消乐”的游戏。游戏初始时给出一个长度为 nnn 的字符串 S=S0S1…Sn−1S = 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<ji < ji<j 且 Si=AS_i = \text{A}Si=A 且 Sj=BS_j = \text{B}Sj=B,小蓝就可以把它们同时消掉。小蓝想知道在经过若干次操作后,直到无法对字符串继续进行操作时,字符串最多剩下多少个字符。
输入格式
输入一行包含一个长度为 nnn 的字符串 SSS。
输出格式
输出一行包含一个整数表示答案。
输入输出样例 #1
输入 #1
BABAABBA
输出 #1
4
说明/提示
样例说明
先消掉 (S1,S6)(S_1, S_6)(S1,S6),再消掉 (S4,S5)(S_4, S_5)(S4,S5),此时剩下 BBAA\text{BBAA}BBAA,无法继续进行操作。
评测用例规模与约定
- 对于 10%10\%10% 的评测用例,1≤n≤201 \leq n \leq 201≤n≤20;
- 对于 20%20\%20% 的评测用例,1≤n≤1001 \leq n \leq 1001≤n≤100;
- 对于 50%50\%50% 的评测用例,1≤n≤100001 \leq n \leq 100001≤n≤10000;
- 对于所有评测用例,1≤n≤1061 \leq n \leq 10^61≤n≤106。
写在前面
可能是最后一舞了
思路
很容易看出来是双指针,然后一直模拟即可
代码
#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;
}
