IT之家 iOS 7.93 更新:極大的適配 iOS 15 正式版
阿新 • • 發佈:2021-10-21
顯然還是一個線性基的問題,那麼很顯然要用線性基
對於一堆石頭\(S_1,S_2,S_3---\),如果加入X會令異或值為0的話,那麼顯然我們可以拿出一塊再把x放進去
這樣只需要線性基檢查能不能放,從大到小放就行。
這告知了我們求線性基可以考慮改變順序
#include<bits/stdc++.h> #define int long long using namespace std; template<class T>inline void read(T &x) { x=0;register char c=getchar();register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); if(f)x=-x; } template<class T>inline void print(T x) { if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar('0'+x%10); } string s; int p[60]; int n,m; int cnt; int num; void add(int x){ for(int i=n-1;i>=0;--i){ if(((1ll<<i)&x)==0) continue; if(!p[i]){ cnt++; p[i]^=x; break; } x^=p[i]; } } signed main(){ read(n);read(m); for(int i=1;i<=m;++i){ cin>>s; num=0; for(int j=n-1;j>=0;--j){ if(s[j]=='O'){ num|=(1ll<<j); } } add(num); } cout<<(1ll<<cnt)%2008; return 0; }