#include<bits/stdc++.h> #define x first #define y second #define vv vector #define vi vector<int> #define vii vector<vector<int>> #define pii pair<int,int> usingnamespace std; typedeflonglong i64; constexpr i64 inf = 1e18;
voidsolve(){ int n, m, k; cin>>n>>m>>k; vv<i64> a(n + 1, 0); vv<i64> b(m + 1, 0); vv<vv<i64>> dp(n + 1, vv<i64> (m + 1, inf)); vv<i64> f((1 << m) + 1, 0); i64 ans = 0; for(int i = 1; i <= n; i++){ cin>>a[i]; //先统计总值 ans += a[i]; //预处理dp dp[i][0] = a[i]; } for(int i = 1; i <= m; i++){ cin>>b[i]; } //状压预处理 for(int i = 0; i < (1 << m); i++){ f[i] = (1 << 31) - 1; for(int j = 1; j <= m; j++){ if(i >> (j-1) \& 1){ f[i] \&= b[j]; } } } //状态转移 for(int i = 1; i <= n; i++){ for(int j = 0; j < (1 << m); j++){ dp[i][__builtin_popcount(j)] = min(dp[i][__builtin_popcount(j)], a[i] \& f[j]); } } priority_queue<i64, vv<i64>, greater<>>q; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ q.push(dp[i][j] - dp[i][j-1]); } } while(k--){ ans += q.top(); q.pop(); } cout<<ans<<endl; } intmain(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin>>t; while(t--){ solve(); } return0; }