#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; } |