【洛谷P2447】[SDOI2010]外星千足虫

外星千足虫

题目链接

 

首先,它一看题解就是个高斯消元

只是改成了奇偶性的判断

性质:

奇数+奇数=偶数

奇数+偶数=奇数

偶数+奇数=奇数

偶数+偶数=偶数

于是我们用1表示奇数,0表示偶数

 

1+1=0

1+0=1

0+1=1

0+0=0

 

这个"+"好像可以换成"^" 。。。

 

于是开始搞死高斯消元

 

 1 // luogu-judger-enable-o2
 2 #pragma GCC optimize ("O3")
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<bitset>
 6 using namespace std;
 7 int n,m,R;
 8 bitset<10010> a[20010],ans;
 9 char s[10010];
10 inline void read(int line)
11 {
12     scanf("%s",s);
13     for(int i=1;i<=n;i++)
14      a[line][i]=s[i-1]-'0';
15     getchar();
16     char c=getchar();
17     a[line][n+1]=c-'0';
18 }
19 inline bool Gauss()                        //高斯消元模板 
20 {
21     for(register int i=1;i<=n;i++)
22     {
23         int j=i;
24         while(!a[j][i]&&j<=m) j++;        //向下找到为1的一行 
25         if(j==m+1) return 0;
26         R=max(j,R);                        //需要用到的行的最大行号 
27         if(i!=j) swap(a[i],a[j]);
28         for(register int j=i+1;j<=m;j++)            //消元,将矩阵变换为上三角矩阵 
29          if(a[j][i]&&i!=j) a[j]^=a[i];
30 //        for(int k=1;k<=m;k++,puts(""))
31 //         for(int l=1;l<=n+1;l++)
32 //          cout<<a[k][l]<<' ';
33 //        puts("");
34     }
35     return 1;
36 }
37 int main()
38 {
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=m;i++) read(i);
41     if(Gauss())
42     {
43         printf("%d\n",R);
44         for(register int i=n;i>=1;i--)    //回代 
45         {
46             ans[i]=a[i][n+1];
47             for(register int j=i+1;j<=n;j++) 
48              if(a[i][j]&&ans[j]) ans[i]=!ans[i];    //只有奇数对当前答案产生影响 
49         }
50         for(register int i=1;i<=n;i++)
51          if(ans[i]) puts("?y7M#");
52          else puts("Earth");
53     }
54     else puts("Cannot Determine");
55     return 0;
56 }

 

posted @ 2018-04-27 17:26  yjk  阅读(160)  评论(0编辑  收藏  举报