题目:题目链接
题目大意
题目描述
你得到一个长度为 N+1N+1 的字符串,由A
和B
组成:S=S0⋯SN。对于每个k=1,…,N,解决以下问题。
Alice和Bob将使用集合X进行游戏,该集合最初为空。对于t=1,…,k,按此顺序,他们将执行以下操作:
如果t是奇数,则Alice将选择一个非负整数x,并将X替换为X∪{x};
如果t是偶数,Bob将选择一个非负整数x,并将X替换为X∪{x}。
在所有k次操作之后让x成为mex(X)。如果字母Sx是A
,则Alice获胜;如果Sx是B
,则Bob获胜。注意X最多有k个元素,所以x=mex(X)≤k和字符Sx存在。
当两个玩家都做出最优选择时,打印赢家的名字。
对于由非负整数组成的有限集合X,mex(X)是使得x∉X的最小非负整数x。
输入格式
为以下格式:
N
S
N的范围为:1≤N≤2e5;S是长度为N+1的字符串,由A
和B
组成。
输出格式
打印N行。当两个玩家在游戏中以k=i进行最佳游戏时,第i行应该包含赢家的名字(Alice
或Bob
)。
测试样例
样例一:
输入
2
ABB
输出
Alice
Bob
样例二:
输入
4
AAAAA
输出
Alice
Alice
Alice
Alice
样例三:
输入
7
BBAABABA
输出
Bob
Bob
Alice
Bob
Alice
Bob
Alice
题目分析
这个题目中,Alice和Bob轮流选择字符串中的元素,到结束时只会剩下一个。而最终决定胜负的也就是mex(X)这一个元素,我们此时已不用考虑它定义中的最大最小,因为只剩下了一个元素,就是mex(X)。我们也就可以把题目转换为,双方轮流划去串中的元素,最终剩下的是A则Alice胜,反之Bob胜。
显然,对于Alice来讲每一步的最优策略便是划去B,Bob则是划去A。那么这个博弈的胜方便很明了了,若是字符串中A比B多,则Alice胜,B比A多则Bob胜,一样多则Alice胜,因为她先手。
于是我们便能得到以下答案:
代码
#include<bits/stdc++.h>
using namespace std;
int n;
char s[200005];
int main() {
int numa=0;//统计串中A的数量
cin>>n;
cin>>s[0];
if (s[0]=='A')numa++;
for (int i=1;i<=n;i++) {
cin>>s[i];
if (s[i]=='A')numa++;
if (numa>=i+1-numa)cout<<"Alice\n";//A多或A、B一样多,Alice胜
else cout<<"Bob\n";//Bob胜
}
}