洛谷 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); }
众人皆醉我独醒,举世皆浊我独清