//状态机
意:给一个只有AB 的串,AB可以换为BC;BA可换为CB;每次操作得1coin;问最大获得
思路:AB->BC : B往左走 BA->CB :B往右走;
对于每一个B左边有A则可以选择往左走直到再遇到B,选择往右边同理;因此得到的价值即为两个B的位置差
//注意:若上一步的B往右走,则这一步不能往左走;边界处理:假设0与n+1位置都放B
状态表示:f[i,j]:走到ith个b时,走法为j的最大价值
转移方程:f[i,1]=f[i-1,1]+valL
f[i,2]=max(f[i-1,1],f[i-1,2])+valR
valL=b[i]-b[i-1]-1
valR=b[i+1]-b[i]-1
const int N = 2e5 + 10;
int n, k = 0;
string s;
int f[N][3], b[N];
void solve()
{
cin >> s;
n = s.size();
s = " " + s;
memset(f, 0, sizeof f);
k = 0;
b[0] = 0;
for (int i = 1; i <= n; i++)
if (s[i] == 'B')b[++k] = i;
b[k + 1] = n + 1;
for (int i = 1; i <= k; i++)
{
f[i][1] = f[i - 1][1] + b[i] - b[i - 1] - 1;
f[i][2] = max(f[i - 1][2], f[i - 1][1]) + b[i + 1] - b[i] - 1;
}
cout << max(f[k][1], f[k][2]) << endl;
}