记录编号 |
533481 |
评测结果 |
AAAAAAAAATTTTTTAAATT |
题目名称 |
石子游戏 |
最终得分 |
60 |
用户昵称 |
bilibili |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
17.584 s |
提交时间 |
2019-06-26 19:06:16 |
内存使用 |
20.53 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int dis[600500],xorans,a[600500],n,vis[600500];
struct QNode{
int dis,Node;
bool operator < (const QNode &b) const{
return dis>b.dis;
}
};
priority_queue<QNode> q;
void dij(int s){
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
q.push((QNode){0,s});
while(!q.empty()){
QNode x=q.top();
q.pop();
if(vis[x.Node])
continue;
vis[x.Node]=true;
for(int i=1;i<=n;i++){
if(dis[a[i]^x.Node]>dis[x.Node]+1){
dis[a[i]^x.Node]=dis[x.Node]+1;
q.push((QNode){dis[a[i]^x.Node],a[i]^x.Node});
}
}
}
}
int main(){
freopen("nim.in","r",stdin);
freopen("nim.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
xorans^=a[i];
dij(0);
printf("%d\n",n-dis[xorans]);
return 0;
}