#include <iostream>
using namespace std;
#define int long long
const int N = 1<<15;
int dp[N][50];
int num[N], sc[N];
int And(int i, int j){
int A = (1LL<<50) - 1;
for (; i <= j; i++)
A &= num[i];
return A;
}
void solve(int l, int r, int st, int en, int k){
if (l > r or st > en)
return;
int m = (st + en) / 2, b = l, vl = 2e9 + 7;
for (int i=l;i<=min(r, m-1);i++){
int val = dp[i][k-1] + __builtin_popcountll(And(i+1, m)) * (sc[m] - sc[i]);
if (val < vl)
vl = val, b = i;
// cout<<i<<' '<<m<<' '<<dp[i][k-1]<<' '<<val<<endl;
}
dp[m][k] = vl;
solve(l, b, st, m-1, k);
solve(l, b, m+1, en, k);
}
signed main(){
int n, t, s;
cin>>n>>t>>s;
for (int i=1;i<=t;i++)
cin>>sc[i], sc[i] += sc[i-1];
for (int i=0;i<n;i++){
string str;
cin>>str;
for (int j=1;j<=t;j++)
num[j] |= (1LL<<i) * (str[j-1] == '1');
}
for (int i=1, A = (1LL<<50) - 1;i<=t;i++){
A &= num[i];
dp[i][1] = sc[i] * __builtin_popcountll(A);
}
for (int k=2;k<=s;k++)
solve(k-1, t, 1, t, k);
for (int i=1;i<=s;i++)
cout<<dp[t][i]<<endl;
}