2017 icpc xian XOR( 在线线性基处理线性基的并 )
作者:互联网
题意:最大化 Z=K or (A[i1] xor A[i2] … xor A[it]) ( L<=i <= R ) ,区间查询
思路:注意到,我们可以忽略线性基中 对应 k 的位置为1 的位,所以我们一开始将a数组中的每个数 & ~k
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int base = 30;
const int maxn = 10005;
template <typename T>
struct node
{
T a[base+1]; //线性基的插入结果
int pos[base+1];
void init(){
memset( a,0,sizeof(a) );
memset( pos,0,sizeof(pos) );
}
bool ins(T b,int _pos) // 向线性基中插入一个数
{
for(int i=base;i>=0;i--)
if(b>>i){
int tmp = a[i];
if(!a[i])
{
a[i]=b;pos[i] = _pos;
return true ;
}else{
if( pos[i] < _pos ){
tmp = a[i];
a[i] = b;
swap( pos[i],_pos );
}
}
b^=tmp;
}
return false ;
}
bool check (T b) // 如果可以表示出来,返回true ,否则返回 false
{
for(int i=base;i>=0;i--)
{
if(b>>i)
{
if(!a[i])return false ;
b^=a[i];
}
}
return true ;
}
T solve( int l ){ //在线线性基区间查询操作,左端点为l
int res = 0;
for( int i = base;i >= 0;i-- ){
if( a[i] && pos[i] >= l && !(res >> i & 1) ){
res ^= a[i];
}
}
return res;
}
};
node<int>t[10005];
int a[maxn];
void append( int id,int v ){
t[id] = t[id-1];
t[id].ins( v,id );
}
int main(){
int T;
scanf("%d",&T);
while(T--){
t[0].init();
int n,q,k;
scanf("%d%d%d",&n,&q,&k);k = ~k;
for( int i = 1;i <= n;i++ ) {
scanf("%d",&a[i]);a[i] &=k;
append( i,a[i]);
}
k = ~k;
for( int l,r,i = 1;i <= q;i++ ){
scanf("%d%d",&l,&r);
int ans = t[r].solve(l);
printf("%d\n",ans|k );
}
}
return 0;
}
标签:XOR,int,xian,pos,base,线性,return,id 来源: https://blog.csdn.net/ehdhg13455/article/details/100664428