线性基求交板子
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; } };