代码思路应该是对的,为什么过不了样例
#include<queue>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
mt19937 myrand(time(0));
inline ll read(){
ll x=0,w=1;
char ch=0;
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*w;
}
void write(ll x){
if(x<0){
putchar('-');
x=-x;
}
static int sta[35];
int top=0;
do{
sta[top++]=x%10,x/=10;
}while(x);
while(top)putchar(sta[--top]+'0');
}
ll n,m,k;
const ll INF=LLONG_MAX/200;
ll a[100005],b[20],sum;
priority_queue<ll>q;
ll num[100005][20];
ll ad[1<<10];
inline void work(){
n=read();m=read();k=read();
sum=0;while(!q.empty())q.pop();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)b[i]=read();
for(int i=1;i<=n;i++)sum+=a[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)num[i][j]=INF;
}
for(int i=0;i<(1<<m);i++)ad[i]=(1<<30)-1;
for(int S=0;S<(1<<m);S++){
for(int i=1;i<=m;i++){
if(S&(1<<(i-1))){
ad[S]&=b[i];
}
}
}
for(int i=1;i<=n;i++){
for(int S=0;S<(1<<m);S++){
int cnt=__builtin_popcount(S);
num[i][cnt]=min(num[i][cnt],a[i]&ad[S]);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
q.push(num[i][j]-num[i][j+1]);
}
}
while(k--){
sum-=q.top();
q.pop();
}
write(sum);
puts("");
}
int t;
int main(){
t=read();
while(t--)work();
return 0;
}