#include <bits/stdc++.h>
using namespace std;
typedef vector<unsigned int> vi;
const int MX=200050,md=1000000007;
int n,m,x[2*MX],y[2*MX];
set<vi> q,was;
int getbit(vi& v, int j) {
return (v[j/32]>>(j&31))&1;
}
void xorbit(vi& v, int j) {
v[j/32]^=(1U<<(j&31));
}
int main() {
scanf("%d%d",&n,&m);
int len=(n-1)/32+1;
vi v(len);
for (int i=0; i<n; i++) {
int x;
scanf("%d",&x);
if (x) xorbit(v,i);
}
for (int i=0; i<m; i++) {
scanf("%d%d",&x[i],&y[i]);
--x[i];
--y[i];
}
q.insert(v);
while (!q.empty()) {
auto qt=q.begin();
v=*qt;
q.erase(qt);
for (int j=0; j<m; j++) {
int bx=getbit(v,x[j]);
int by=getbit(v,y[j]);
if (bx==by) {
xorbit(v,x[j]);
xorbit(v,y[j]);
auto it=was.find(v);
if (it==was.end()) {
it=q.find(v);
if (it==q.end()) q.insert(v);
}
xorbit(v,x[j]);
xorbit(v,y[j]);
}
}
was.insert(v);
v.clear();
}
printf("%d\n",int(was.size())%md);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <bits/stdc++.h> using namespace std; typedef vector<unsigned int> vi; const int MX=200050,md=1000000007; int n,m,x[2*MX],y[2*MX]; set<vi> q,was; int getbit(vi& v, int j) { return (v[j/32]>>(j&31))&1; } void xorbit(vi& v, int j) { v[j/32]^=(1U<<(j&31)); } int main() { scanf("%d%d",&n,&m); int len=(n-1)/32+1; vi v(len); for (int i=0; i<n; i++) { int x; scanf("%d",&x); if (x) xorbit(v,i); } for (int i=0; i<m; i++) { scanf("%d%d",&x[i],&y[i]); --x[i]; --y[i]; } q.insert(v); while (!q.empty()) { auto qt=q.begin(); v=*qt; q.erase(qt); for (int j=0; j<m; j++) { int bx=getbit(v,x[j]); int by=getbit(v,y[j]); if (bx==by) { xorbit(v,x[j]); xorbit(v,y[j]); auto it=was.find(v); if (it==was.end()) { it=q.find(v); if (it==q.end()) q.insert(v); } xorbit(v,x[j]); xorbit(v,y[j]); } } was.insert(v); v.clear(); } printf("%d\n",int(was.size())%md); return 0; } |
English