题意:给定n个数字 问最多能异或出多少个数字
题解: 只需要计算出线性基能插入多少个基底即可 基底选与不选 所以答案为 2^基底数量
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<‘=‘<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ///////////////////////////////////// const int N=1e5+10; char s[N]; ll n,m,p[N],cnt; void upnode(ll x) { repp(i,50,0)if((x>>i&1)) { if(!p[i]) { p[i]=x;cnt++; break; } x^=p[i]; } } int main() { cin>>n>>m; rep(i,1,m) { scanf("%s",s+1); ll x=0; rep(i,1,n) x=(x<<1ll)+(s[i]==‘O‘); upnode(x); } cout<<(1ll<<cnt)%(1ll*2008); return 0; }
原文:https://www.cnblogs.com/bxd123/p/11587598.html