一、题目
二、解法
我们把出现在 i i i位置的正面朝上记为状态 i i i,原串可以分解成若干个状态的集合,如样例的状态集合 S = { 1 , 2 , 4 , 7 } S=\{1,2,4,7\} S={1,2,4,7}
状态 i i i可以直接变为状态 0 0 0,或则通过翻转左边变为状态 i − 1 i-1 i−1
那么 nim \text{nim} nim游戏的雏形就显现了出来。但是问题来了,如果若干次操作后出现状态 i i i和状态 i + 1 i+1 i+1,此时我们对状态 i + 1 i+1 i+1操作可能出现两个状态 i i i,但是应该两个状态 i i i相抵消才对。
考虑 nim \text{nim} nim的计算方式:求异或和,上述的两个状态 i i i会在求异或和的时候变为 0 0 0!这就解释了为什么直接用 nim \text{nim} nim的方法来算是对的。
#include <cstdio>
const int M = 10005;
int read()
{
int x=0,flag=1;
char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int n,ans;char s[M];
int main()
{
n=read();
scanf("%s",s+1);
for(int i=1;i<=n;i++)
if(s[i]=='H')
ans^=i;
if(ans) puts("Alice");
else puts("Bob");
}