https://ac.nowcoder.com/acm/contest/5667/E
线性基可以求出任意取出一些数的最大值
其实可以想到到了后面就会把线性基每一位填满了,因为数字大小只有2^18,那应该只有18位,那么做20次fwt算出答案就可以了
满秩了后答案就是有规律的了,可以知道ans[i]=ans[i-2],因为可以选两个相同的抵消掉,还是最大值
为什么不能ans[i]=ans[i-1]呢,因为会有 1 1 1 1 这种东西出现。。。
#include
using namespace std;
const int mod=998244353,r2=mod/2+1;
int a[300010],b[300010];
int ans[25];
int ad(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
void fwtxor(int a[],int k,int arr){
for(int mid=1;mid=0;j--){
if(b[j]){
ans[i]=j;
break;
}
}
fwtxor(b,k,1);
for(int i=0;il+2){
if(i%2==l%2)printf("%d ",ans[l+2]);
else printf("%d ",ans[l+1]);
}
else printf("%d ",ans[i]);
}
}