链接:https://ac.nowcoder.com/acm/contest/946/E

来源:牛客网

筱玛爱游戏

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 524288K,其他语言1048576K

64bit IO Format: %lld

题目描述

筱玛是一个热爱游戏的好筱玛。最近,筱玛和马爷在玩这样一种游戏:

首先,桌面上一共有

n

n个数。

两个人轮流从桌面上取走一个数,并把这个数放入集合中。

如果在某次操作结束后,集合中存在一个异或和为

0

0的非空子集,那么进行这次操作的人输。

如果全部取完,则最后操作的人赢。

筱玛和马爷都聪明绝顶,他们都会按照最优策略进行游戏。

马爷作为筱玛的爷爷,决定让筱玛选择先手还是后手。

筱玛为了稳操胜券,想提前知道对于当前的游戏,是先手必胜还是后手必胜。

筱玛想考考你,让你帮他解决这个问题。

输入描述:

输入共两行。

第一行一个整数

n

n,表示桌面上一共有n个数字。

第二行读入

n

n个数,表示桌面上每个数的数值。

输出描述:

输出"First"或"Second"(不包括引号)表示先手赢或后手赢。

示例1

输入

复制

3

1 2 3

输出

复制

Second

备注:

对于100%的数据,

n



10

5

n≤105,数值大小



2

61

≤261。

题意:



思路:



子集异或和不为0这恰好是线性基的性质。

那么我们把数组构造一个线性基,算出能插入到线性基里的个数,

如果是基数那么是先手赢,否则是后手赢。

细节见代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <iomanip>
  12. #define ALL(x) (x).begin(), (x).end()
  13. #define rt return
  14. #define dll(x) scanf("%I64d",&x)
  15. #define xll(x) printf("%I64d\n",x)
  16. #define sz(a) int(a.size())
  17. #define all(a) a.begin(), a.end()
  18. #define rep(i,x,n) for(int i=x;i<n;i++)
  19. #define repd(i,x,n) for(int i=x;i<=n;i++)
  20. #define pii pair<int,int>
  21. #define pll pair<long long ,long long>
  22. #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  23. #define MS0(X) memset((X), 0, sizeof((X)))
  24. #define MSC0(X) memset((X), '\0', sizeof((X)))
  25. #define pb push_back
  26. #define mp make_pair
  27. #define fi first
  28. #define se second
  29. #define eps 1e-6
  30. #define gg(x) getInt(&x)
  31. #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
  32. using namespace std;
  33. typedef long long ll;
  34. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  35. ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
  36. ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
  37. inline void getInt(int* p);
  38. const int maxn=1000010;
  39. const int inf=0x3f3f3f3f;
  40. /*** TEMPLATE CODE * * STARTS HERE ***/
  41. struct LB {
  42. ll d[63], p[63];
  43. int cnt, mx;
  44. LB() {
  45. memset(d, 0, sizeof(d));
  46. memset(p, 0, sizeof(p));
  47. cnt = 0, mx = 63;
  48. }
  49. void init() {
  50. memset(d, 0, sizeof(d));
  51. memset(p, 0, sizeof(p));
  52. }
  53. int add(ll val) {
  54. /*插入时判断之前是否有数会与val异或得0,判第k小时如果有为0的情况,k要减一*/
  55. for (int i = mx - 1; i >= 0; i--) {
  56. if (val & (1LL << i)) {
  57. if (!d[i]) {
  58. d[i] = val;
  59. return 1;
  60. }
  61. val ^= d[i];
  62. }
  63. }
  64. return 0;
  65. }
  66. bool query(ll val) { // 查询val这个数是否存在
  67. for (int i = mx - 1; i >= 0; i--) {
  68. if (val & (1LL << i)) {
  69. if (!d[i]) return 0;
  70. val ^= d[i];
  71. }
  72. }
  73. return 1;
  74. }
  75. ll query_max(ll val) {
  76. ll ret = val;
  77. for (int i = mx - 1; i >= 0; i--) if ((ret ^ d[i]) > ret) ret ^= d[i];
  78. return ret;
  79. }
  80. ll query_min() {
  81. for (int i = 0; i < mx; i++) if (d[i]) return d[i];
  82. return 0;
  83. }
  84. void rebuild() {//消元,保存到p数组
  85. cnt = 0;
  86. for (int i = 0; i < mx; i++) {
  87. for (int j = 0; j < i; j ++ )
  88. if (d[i] & (1LL << j)) d[i] ^= d[j];
  89. }
  90. for (int i = 0; i < mx; i++) if (d[i]) p[cnt++] = d[i];
  91. }
  92. ll query_kth(ll k) { //使用前需要rebuild
  93. ll ret = 0;
  94. if (k >= (1LL << cnt)) return -1;
  95. for (int i = cnt - 1; i >= 0; i--) if (k & (1LL << i)) ret ^= p[i];
  96. return ret;
  97. }
  98. ll find(ll x) { //找x是第几大的数,需保证x一定在
  99. ll ret = 0, c = 0;
  100. for (int i = 0; i < mx; i++) {
  101. if (d[i]) {
  102. if (x >> i & 1) ret += (1LL << c);
  103. c++;
  104. }
  105. }
  106. return ret;
  107. }
  108. LB operator+(const LB & _A)const { //合并
  109. LB ret = *this;
  110. for (int i = mx - 1; i >= 0; i--) if (_A.d[i]) ret.add(_A.d[i]);
  111. return ret;
  112. }
  113. };
  114. LB base=LB();
  115. int main()
  116. {
  117. //freopen("D:\common_text\code_stream\in.txt","r",stdin);
  118. //freopen("D:\common_text\code_stream\out.txt","w",stdout);
  119. gbtb;
  120. int n;
  121. cin>>n;
  122. int ans=0;
  123. repd(i,1,n)
  124. {
  125. ll x;
  126. cin>>x;
  127. ans^=base.add(x);
  128. }
  129. if(ans)
  130. cout<<"First"<<endl;
  131. else
  132. cout<<"Second"<<endl;
  133. return 0;
  134. }
  135. inline void getInt(int* p) {
  136. char ch;
  137. do {
  138. ch = getchar();
  139. } while (ch == ' ' || ch == '\n');
  140. if (ch == '-') {
  141. *p = -(getchar() - '0');
  142. while ((ch = getchar()) >= '0' && ch <= '9') {
  143. *p = *p * 10 - ch + '0';
  144. }
  145. }
  146. else {
  147. *p = ch - '0';
  148. while ((ch = getchar()) >= '0' && ch <= '9') {
  149. *p = *p * 10 + ch - '0';
  150. }
  151. }
  152. }

牛客练习赛49 E 筱玛爱游戏 (线性基+博弈)的更多相关文章

  1. 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)

    链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...

  2. 牛客练习赛B题 筱玛的排列(找递推规律)

    链接:https://ac.nowcoder.com/acm/contest/342/B来源:牛客网 筱玛的排列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...

  3. 牛客练习赛 A题 筱玛的快乐

    链接:https://ac.nowcoder.com/acm/contest/342/A来源:牛客网 筱玛的快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...

  4. 2019年牛客多校第一场 H题XOR 线性基

    题目链接 传送门 题意 求\(n\)个数中子集内所有数异或为\(0\)的子集大小之和. 思路 对于子集大小我们不好维护,因此我们可以转换思路变成求每个数的贡献. 首先我们将所有数的线性基的基底\(b\ ...

  5. 2019 牛客暑期多校 第一场 H XOR (线性基)

    题目:https://ac.nowcoder.com/acm/contest/881/H 题意:求一个集合内所有子集异或和为0的长度之和 思路:首先集合内异或和,这是线性基的一个明显标志,然后我们不管 ...

  6. 牛客练习赛53 A 超越学姐爱字符串 (DP)

    牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...

  7. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  8. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  9. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

随机推荐

  1. 分享页(把末尾的JS函数换成这个)

    function jsApiStart(obj) { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以 ...

  2. legend2---lamp.sh一键安装lamp环境需要爬的坑

    legend2---lamp.sh一键安装lamp环境需要爬的坑 一.总结 一句话总结: 1.要记得更改项目权限:chown -R apache:apache /data/www/default/网站 ...

  3. pdf.js浏览中文pdf乱码的问题解决

    由于项目中需要支持移动设备在线浏览pdf,苹果还好,天生支持,但是安卓中就不行了,需要第三方组件的支持. 这里就找到了pdf.js,由于pdf数据太多,开始的时候没法一一测试,所以随便测试打开了几篇没 ...

  4. fail-fast与fail-safe机制

    ----以下来自网址----- http://blog.csdn.net/ch717828/article/details/46892051 什么是 fail-fast 机制? fail-fast机制 ...

  5. 嵌入式Linux之NFS配置

    NFS(Network File System) 1.RPC和rpcbind RPC(Remote Procedure Call)即远程过程调用,是分布式应用的基础,即允许计算机远程调用网络上其他计算 ...

  6. 用JS实现快速排序

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  7. sql语句exists 用法

    参考:SQL语句exists用法,Sql语句中IN和exists的区别及应用 现在有三张表 学生表S: sno ,sname 课程表C:cno ,cname 学生选课表SC: sno ,cno 查询选 ...

  8. JMV监控工具之JConsole

    一.简介 JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具.下面以对tomcat的监控为例,带领大家熟悉JConsole这个工具. 二.配置 ...

  9. Scratch少儿编程系列:(六)诗词《从军行》赏析

    一.程序说明 本程序用来显示<从军行>诗词,逐字显示.本来计划用2.0制作,但在制作过程中,在“造型”中无法输入汉字,临时采用3.0版本,1.4版本也可以. 二.程序流程图 为了更直观的描 ...

  10. Django-DRF组件学习-路由学习

    1.路由router 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework提 ...