#include<bits/stdc++.h>
using namespace std;
#define SET(a,e) memset(a,e,sizeof(a))
#define LL long long
#define LD long double
#define pb push_back
#define x first
#define y second
#define PII pair<int,int>
#define PLI pair<LL,int>
#define PIL pair<int,LL>
#define PLL pair<LL,LL>
#define PDD pair<LD,LD>
#define eps 1e-9
#define HH1 402653189
#define HH2 1610612741

int n, q, cnt[30][10], b[30], dp[550000][30], ans;
bool ok[550000];
char s[10055];

bool valid(int state) {
	int used[10] = {};
	for (int i = 0; i < n; i++)
		if ((1 << i) & state) {
			for (int j = 0; j < 10; j++)
				used[j] += cnt[i][j];
		}
	
	for (int i = 0; i < 10; i++)
		if (used[i] > q)
			return false;
	
	return true;
}

int main() {
	
	scanf("%d%d", &n, &q);
	
	for (int i = 0; i < n; i++)
		scanf("%d", b + i);
	
	for (int i = 0; i < n; i++) {
		scanf("%s", s);
		int len = strlen(s);
		for (int j = 0; j < len; j++)
			cnt[i][s[j] - '0']++;
	}
	
	for (int state = 1; state < (1 << n); state++) 
		ok[state] = valid(state);
	
	for (int i = 0; i < n; i++)
		if (ok[1 << i]) {
			dp[1 << i][i] = b[i];
			ans = max(ans, b[i]);
		}
	
	for (int state = 1; state < (1 << n); state++)
		if (ok[state]){
			vector<int> IN, OUT;
			for (int i = 0; i < n; i++) {
				if ((1 << i) & state)
					IN.push_back(i);
				else
					OUT.push_back(i);
			}
			
			for (int nw : OUT) {
				int to = (1 << nw) | state;
				
				if (!ok[to])
					continue;
				
				for (int old : IN) {
					dp[to][nw] = max(dp[to][nw], dp[state][old] + (b[old] ^ b[nw]));
//					printf("dp[%d][%d] update dp[%d][%d] + %d\n", to, nw, state, old, b[old] ^ b[nw]);
					ans = max(ans, dp[to][nw]);
				}
			}
		}
	
	printf("%d\n", ans);
	
	return 0;
}