[hihocoder 1173] Nim游戏

一、题目

点此看题

二、解法

我们把出现在 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 i1

那么 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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值