#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; }