5435: 取石子
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 35 Solved: 10
[Submit][Status][Discuss]
Description
有 n 堆石子排成一行,第 i 堆石子的个数为 xi。
Alice 和 Bob 轮流取石子,每人每次从两端的石子中选择一堆取走,Alice 先手。
我们知道在传统的取石子游戏中,sg 函数的值为每堆石子个数的异或和。
Alice 和 Bob 都希望自己取到的石子的异或和比对方大。你需要求出谁能获胜。
有多组数据。
Input
第一行一个正整数 t 表示数据组数。每组数据第一行一个正整数 n。第二行 n 个整数 x1~xn。
【数据范围】
Subtask 1 (5pts):n<=15。
Subtask 2 (11pts):n<=100,xi<=50。
Subtask 3 (17pts):n<=500。
Subtask 4 (67pts):无特殊限制。
对于全部数据,1<=t<=100,1<=n<=10000,1<=xi<=10^9。
Output
每组数据一行一个字符串表示答案,平局输出 Draw。
Sample Input
3
2
3 3
2
3 5
3
4 4 4
2
3 3
2
3 5
3
4 4 4
Sample Output
Draw
Alice
Bob
Alice
Bob
思路:设ans=所有数异或和。 如果ans=0,那么无论A取到任何数x,B的数也是x,即是平局。
那么我们考虑ans!=0,那么ans的最高位为i,有(1<<i)一定是奇数个1,结果取决于这一位,我们按照a[]是否有(1<<i),把所有数换位0或者1。
然后现在题目变为了01串,有奇数个1,问轮流从两端取,问先手是否能取到奇数个1。
然后?