•题解
参考CF1100F这道题,不同点是本题有个在尾部插入值得操作,并且只能用在线的线性基;
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mem(a,b) memset(a,b,sizeof(a)) 4 #define ll long long 5 const int maxn=5e5+50; 6 7 int n,m; 8 int a[maxn<<1]; 9 int base[maxn<<1][40]; 10 int p[maxn<<1][40]; 11 12 void Insert(int pos,int x,int k) 13 { 14 for(int i=30;i >= 0;--i) 15 { 16 if(x&(1<<i)) 17 { 18 if(!base[k][i]) 19 { 20 base[k][i]=x; 21 p[k][i]=pos; 22 } 23 else if(p[k][i] < pos) 24 { 25 swap(p[k][i],pos); 26 swap(base[k][i],x); 27 } 28 x ^= base[k][i]; 29 } 30 } 31 } 32 int Max(int l,int r) 33 { 34 int ans=0; 35 for(int i=30;i >= 0;--i) 36 if(p[r][i] >= l) 37 ans=max(ans,ans^base[r][i]); 38 return ans; 39 } 40 void Solve() 41 { 42 for(int i=1;i <= n;++i) 43 { 44 memcpy(base[i],base[i-1],sizeof(base[i-1])); 45 memcpy(p[i],p[i-1],sizeof(p[i-1])); 46 47 Insert(i,a[i],i); 48 } 49 int ans=0; 50 51 while(m--) 52 { 53 int op; 54 scanf("%d",&op); 55 if(!op) 56 { 57 int l,r; 58 scanf("%d%d",&l,&r); 59 60 l=(l^ans)%n+1; 61 r=(r^ans)%n+1; 62 if(l > r) 63 swap(l,r); 64 65 ans=Max(l,r); 66 67 printf("%d\n",ans); 68 } 69 else 70 { 71 int x; 72 scanf("%d",&x); 73 a[++n]=x^ans; 74 75 memcpy(base[n],base[n-1],sizeof(base[n-1])); 76 memcpy(p[n],p[n-1],sizeof(p[n-1])); 77 78 Insert(n,a[n],n); 79 } 80 } 81 } 82 int main() 83 { 84 // freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin); 85 int T; 86 scanf("%d",&T); 87 while(T--) 88 { 89 scanf("%d%d",&n,&m); 90 for(int i=1;i <= n;++i) 91 scanf("%d",a+i); 92 93 Solve(); 94 } 95 return 0; 96 }