比赛 |
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;
- }