洛谷 P3857 彩灯 题解

题面

对于每一个开关,我们可以看成一个0/1串,初始是一个全部为0的串,要求经过这些开关的操作后,出现的不同的0/1串的个数

建模就是存在一些数,这些数异或起来是0(等价于没有操作)。那么需要求一个集合,满足集合中元素相互异或不会出现0.

线性基派上用场了。

接下来就是线性基的基本插入操作和统计一下线性基里的元素个数;

性基内的元素都是由外界元素异或出来的,那么对于线性基内每个元素,我们都有选/不选两种情况,所以ans=1<<cnt

#include <bits/stdc++.h>
#define int long long
using namespace std;
char s[10010];
long long a[10010];
long long p[10010];
int n,m;
signed main()
{    
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        scanf("%s",s);
        for(int j=0;j<n;j++){
            if(s[j]=='O'){
                a[i]^=(1ll<<j);
            }
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=62;j>=0;j--){
            if((a[i]>>j)&1){
                if(p[j]==0){
                    p[j]=a[i];
                    break;
                }
                else{
                    a[i]^=p[j];
                }    
            }
        }
    }
    int cnt=0;
    for(int i=0;i<=62;i++){
        if(p[i]) ++cnt;
    }
    printf("%lld",(1ll<<cnt)%2008);
}

 

posted @ 2019-09-09 17:06  神之右大臣  阅读(114)  评论(0编辑  收藏  举报