![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 //#include<math.h> 5 #include<queue> 6 #include<algorithm> 7 #include<iostream> 8 #include<bitset> 9 using namespace std; 10 11 bool isdigit(char c) {return c>='0' && c<='9';} 12 int qread() 13 { 14 char c;int s=0,t=1;while (!isdigit(c=getchar())) (c=='-' && (t=-1)); 15 do s=s*10+c-'0'; while (isdigit(c=getchar())); return s*t; 16 } 17 18 const int N = 1005, Bit = 30; 19 bitset<N> S[N]; int n, f[N], v[N], g[N]; bool vis[N]; 20 inline void insert(int x) { 21 dow(i,Bit,0) { 22 if( (v[x] >> i) & 1 ) { 23 if( f[i] ) { 24 v[x] ^= v[f[i]]; 25 S[x] ^= S[f[i]]; 26 } else { 27 f[i] = x; 28 vis[x] = 1; 29 } 30 } 31 } 32 } 33 inline void upd(int a,int b) { 34 int id = 0, pos; 35 rep(i,1,n) if( !vis[i] && S[i][a] ) { id = i; break; } 36 if( id ) { 37 rep(i,1,n) if( S[i][a] && i != id ) S[i] ^= S[id], v[i] ^= v[id]; 38 v[id] = v[id] ^ g[a] ^ b, g[a] = b; 39 insert(id); 40 } else { 41 rep(i,0,Bit) if( f[i] && S[i][a] ) { id = i; break; } 42 pos = id, id = f[id], f[pos] = vis[id] = 0; 43 rep(i,1,n) if( S[i][a] && i != id ) S[i] ^= S[id], v[i] ^= v[id]; 44 v[id] = v[id] ^ g[a] ^ b, g[a] = b; 45 insert(id); 46 } 47 } 48 49 int main() { 50 int n = read(); 51 rep(i,1,n) vis[i] = 0, g[i] = v[i] = read(), S[i][i] = 1, insert(i); 52 }