放个链接
题目大意
给一个01串在两个人串中找10,100,110,1010,把他们翻转不能操作就输
了问谁会胜利
题目思路
这个串最后的状态是很好确定的是:
00000000000000…111111111
前面全是零后面全是1,每次操作其实是把0越过1移到前面,10翻转可以把一个0移到前面去
100,110,1010都等同于越过了两个1。
不是最终状态一定可以把10翻转,如果10翻转不到终态一定可以进行其他翻转,简单证一下,如果前面有一个1,10翻不到终态那么1后面一定有大于1个0可以进行100翻转,如果有多个1,不能进行100翻转的话一定有110或
1010的结构。
现在题目就变成了,0要越过多少个1才能变成终态,每次可以越1个或2个,这就是基础的 巴什博弈了然后就是代码了。
ac代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
string s; cin >> s;
ll cnt = 0;
ll ans = 0;
for(int i = s.size() - 1; i >= 0; i --){
if(s[i] == '0') cnt ++;
else ans += cnt;
}
if(ans % 3 != 0) printf("Alice\n");
else printf("Bob\n");
return 0;
}