P3857 [TJOI2008]彩灯 线性基求可以异或出的数量

题意:给出m个开关,这m个开关可以控制这n盏灯

   具体控制方式会再给出,题目中以OX方式来表示是否能控制第K盏灯

思路:题目中给出的n的范围是到50,也就是说,在LL的范围之内

   我们把每一个开关控制的情况转换成数字,然后直接计算最多异或出来的数目

   最后答案即为:2的(最多数目)的次方

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 char a[60][60];
 5 ll b[60];
 6 ll p[60];
 7 int num=0;
 8 void Insert(ll k) {
 9     for(ll i=55;i>=0;i--) {
10         if(!(k&(1LL<<i))) continue;
11         if(!p[i]){
12             p[i]=k;
13             if(k!=0)   //这里加没加这个条件都能ac,但是应该得加上才对
14                 num++;
15             return;
16         }
17         k ^= p[i];
18     }
19 }
20 int main()
21 {
22     int n,m;
23     scanf("%d%d",&n,&m);
24     for(int i=1;i<=m;i++){
25         scanf("%s",a[i]+1);
26     }
27     for(int i=1;i<=m;i++){
28         ll sum=0;
29         ll base=1;
30         for(int j=1;j<=n;j++){
31             if(a[i][j]=='O') sum+=base;
32             base*=2;
33         }
34         b[i]=sum;
35         Insert(b[i]);
36     }
37     ll res=1;
38     for(int i=1;i<=num;i++){
39         res=res*2%2008;
40     }
41     printf("%lld\n",res);
42     return 0;
43 }
View Code

 

posted @ 2021-01-25 09:47  古比  阅读(82)  评论(0编辑  收藏  举报