给n个硬币的字符串,H代表正面朝上,T代表反面,每次每人只能翻一个正面的,然后选择是否将这个左边的(可能没有)一个硬币反转一次

首先,我们先将局面分解一下,每一次我们只考虑一枚硬币。
不妨设所有硬币全部背面朝上的局面为局面0
假设现在N枚硬币,只有第1枚是正面朝上的。该局面只能转化为全部硬币背面朝上的局面。我们假定该局面为 局面1,则局面1可以转化为局面0。
假设只有第2枚是正面朝上的。该局面可以转化为:只有硬币1正面朝上;全部硬币背面朝上。我们假定该局面为 局面2,局面2可以转化为局面1和局面0。
同理我们可以推定,第i枚硬币正面朝上的局面为局面i,局面i可以转化为局面0…i-1。

首先可以推出这个结论,比如现在有一个硬币在3位置,其实就相当于Nim游戏中一堆3个的石子,因为局面3可以通过一次操作变成局面2 局面1 局面0,这和Nim是一样的,3个石子,可以通过一次操作变成2个 1个 0个
所以就转化为Nim游戏了,很神奇,加深了对Nim的理解

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=10050;
char s[N];
int n;
int main(void){
   
    scanf("%d",&n);
    scanf("%s",s+1);
    int ans=0;
    for(int i=1;i<=n;i++){
   
        if(s[i]=='H'){
   
            ans^=i;
        }
    }
    if(ans){
   
        printf("Alice\n");
    }
    else{
   
        printf("Bob\n");
    }
    return 0;
}