记录一个菜逼的成长。。
题目链接
题目大意:
给你一个n长的01串,每次可以用一个0去替代连续的两个1的字符
Alice先手,谁不能替代谁就输。
打sg表。
假设现在有一个
k
长的连续的
1112...1k−11k
它的上一个状态就是从中去掉两个连续的1后的两个子状态的异或
假设从
j(0≤j≤k−2)
的位置取两个,那么两个子状态就是
sg[j]
和
sg[k−2−j]
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define clr clear()
#define pb push_back
const int maxn = 1000 + 10;
int sg[maxn],Hash[maxn];
char str[maxn];
void sg_solve(int n)
{
memset(sg,0,sizeof(sg));
for( int j,i = 1; i <= n; i++ ) {
memset(Hash,0,sizeof(Hash));
for( j = 0 ; j <= i-2; j++ ){
Hash[sg[j] ^ sg[i-2-j]] = 1;
}
for( j = 0; j <= n; j++ )
if(!Hash[j])break;
sg[i] = j;
}
}
vector<int>ve;
int main()
{
sg_solve(maxn-1);
int T;scanf("%d",&T);
while(T--){
int n,cnt = 0,ans = 0;
scanf("%d%s",&n,str);
ve.clr;
for( int i = 0; str[i]; i++ ){
if(str[i] == '1')cnt++;
else {
if(cnt)ve.pb(cnt);
cnt = 0;
}
}
if(cnt)ve.pb(cnt);
for( int i = 0; i < ve.size(); i++ ){
ans ^= sg[ve[i]];
}
puts(ans ? "Alice" : "Bob");
}
return 0;
}