彩灯
luogu 3857
金牌导航 线性基-1
题目大意
给若干个01串,让你选择其中一些,问你异或的值有多少种
输入样例
2 3
OO
XO
OX
输出样例
4
数据范围
1⩽N,M⩽501\leqslant N,M\leqslant 501⩽N,M⩽50
解题思路
对于原来的01串,先求出其线性基(大小为k)
根据集合中的任何数能且只能由线性基中的一种组合异或而得
结果就是2k2^k2k
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define wyc 2008
using namespace std;
ll n, m, ans, d[60];
string str;
int main()
{scanf("%lld%lld", &n, &m);ans = 1;for (ll i = 1; i <= m; ++i){cin>>str;ll x = 0;for (int j = 0; j < n; ++j)x = x * 2 + (str[j] == 'O'? 1: 0);for (int j = 50; j >= 0; --j)if (x & (1ll<<j))//求线性基{if (d[j]) x ^= d[j];else{d[j] = x;ans = ans * 2 % wyc;//计算结果break;}}}printf("%lld", ans);return 0;
}