題面
題解
題意:給定n個01串,求互相異或能湊出多少不同的01串。
線性基的基礎應用。
對於線性基中的01串,如果我們取其中一些湊成一個新的01串,有一個重要的性質:任意2個不同方案湊出的01串也不相同。
因此我們只需要求出給定01串的線性基大小,然後求出有多少搭配方案即可,方案數即爲\(2^{tot} - 1\)
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 55
#define LL long long
#define p 2008
int n, m, ans;
LL f[AC], maxn;
char s[AC];
inline int qpow(int x, int have)
{
int rnt = 1;
while(have)
{
if(have & 1) rnt = rnt * x % p;
x = x * x % p, have >>= 1;
}
return rnt;
}
void work()
{
scanf("%d%d", &n, &m), maxn = 1LL << 50;
for(R i = 1; i <= m; i ++)
{
scanf("%s", s + 1);
LL x = 0;
for(R j = 1; j <= n; j ++) x = (x << 1) + (s[j] == 'O' ? 1 : 0);
maxn = 1LL << 50;
for(R j = 50; ~j; j --, maxn >>= 1)
{
if(!(x & maxn)) continue;
if(!f[j]) {f[j] = x, ++ ans; break;}
else x ^= f[j];
}
}
printf("%d\n", qpow(2, ans));
}
int main()
{
// freopen("in.in", "r", stdin);
work();
// fclose(stdin);
return 0;
}