比赛 |
NOI2015Day1 |
评测结果 |
RRRRRRRRRR |
题目名称 |
程序自动分析 |
最终得分 |
0 |
用户昵称 |
石家庄二中教练 |
运行时间 |
0.008 s |
代码语言 |
C++ |
内存使用 |
2.84 MiB |
提交时间 |
2015-08-01 12:40:51 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
typedef long long LL;
const int SIZEN=100010;
const int SIZEH=70;
typedef bitset<SIZEN> BTS;
int bitcnt(LL n){
if(n==0) return 1;
int ans=0;
while(n){
ans++;
n/=2;
}
return ans;
}
int N,M=0;
LL S;
LL HA[SIZEN];
bool Gauss_Jordan(BTS A[SIZEH],int h,int n,bool b[SIZEN]){
static int pivot[SIZEH];
int i,r=0;
for(i=0;i<h;i++){
while(r<n){
bool flag=false;
for(int k=i;k<h;k++){
if(A[k][r]==1){
flag=true;
pivot[i]=r;
swap(A[k],A[i]);
break;
}
}
if(flag) break;
r++;
}
if(r==n) break;
for(int t=0;t<h;t++){
if(t==i) continue;
if(A[t][r]==1) A[t]^=A[i];
}
}
memset(b,0,sizeof(b));
for(int t=i;t<h;t++) if(A[t][n]==1) return false;
for(int t=0;t<i;t++) b[pivot[t]]=A[t][n];
return true;
}
BTS A[SIZEH],A1[SIZEH];
bool b[SIZEN];
bool test(int h,int k,int p){
memcpy(A1,A,sizeof(A));
A1[h][N]=p;
for(int i=0;i<N;i++) A1[h][i]=(HA[i]>>k)&1;
if(Gauss_Jordan(A1,h+1,N,b)){
memcpy(A,A1,sizeof(A1));
return true;
}
return false;
}
void work(void){
int h=0;
for(int i=M-1;i>=0;i--){
if(((S>>i)&1)==0){
if(!test(h,i,1)) test(h,i,0);
h++;
}
}
for(int i=M-1;i>=0;i--){
if(((S>>i)&1)==1){
if(!test(h,i,0)) test(h,i,1);
h++;
}
}
for(int i=0;i<N;i++) printf("%d ",2-(int)b[i]);printf("\n");
/*LL X1=0,X2=0;
for(int i=0;i<N;i++){
if(b[i]) X1^=HA[i];
else X2^=HA[i];
}
cout<<X1+X2<<endl;*/
}
void read(void){
scanf("%d",&N);
S=0;
for(int i=0;i<N;i++){
scanf("%I64d",&HA[i]);
M=max(M,bitcnt(HA[i]));
S^=HA[i];
}
}
int main(){
//freopen("t1.in","r",stdin);
read();
work();
return 0;
}