struct _ {
unsigned a[32];
_ () {memset(a,0,sizeof a);}
void ins(unsigned x) {
for(int i=31;i>=0;--i) if (x>>i&1) {
if (a[i]) x ^= a[i];
else {
a[i] = x;
return;
}
}
}
int chk(unsigned x) {
for (int i=31;i>=0;--i) if (x>>i&1) {
if (a[i]) x ^= a[i];
else return 0;
}
return 1;
}
_ operator + (const _ &rhs) const {
_ ret;
unsigned p[32]{}, f[32]{};
for(int i=0;i<=31;++i) p[i]=a[i];
for(int i=31;i>=0;--i) {
auto x = rhs.a[i], y = 1u<<i;
for(int j=31;j>=0;--j) if (x>>j&1) {
if (p[j]) x^=p[j],y^=f[j];
else {
p[j]=x,f[j]=y;
break;
}
}
if (x==0) {
unsigned sum = 0;
for(int j=31;j>=0;--j) if (y>>j&1) sum ^= rhs.a[j];
ret.ins(sum);
}
}
return ret;
}
};