P3857 [TJOI2008]彩灯

【题意】

给定n个开关,每个开关可以控制一些灯,开始时灯全部是灭的,问通过按动开关,最多有多少种不同的灯的状态

【分析】

把每个开关看成二进制数,加入线性基,由于线性基异或的结果都不相同,所以我们只需要计算出线性基元素个数cnt,答案就是(1<<cnt)

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
int n,m;
ll a[maxn],p[maxn];
char s[maxn];
int main()
{
//    freopen("a.in","r",stdin);
//    freopen("a.out","w",stdout);
    int sz=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%s",s);
        int len=strlen(s);
        for(int j=0;j<len;j++)
            if(s[j]=='O')
                a[i]+=(1LL<<(n-j));
    }
    for(int i=1;i<=m;i++)
        for(int j=63;j>=0;j--)
        {
            if(!(a[i]&(1LL<<j))) continue;
            if(p[j]) a[i]^=p[j];
            else
            {
                p[j]=a[i];
                sz++;
                break;
            }
        }
    printf("%lld",(1LL<<sz)%2008);
    return 0;
}

 

posted @ 2021-05-29 10:48  andyc_03  阅读(71)  评论(0编辑  收藏  举报