#include using namespace std; int main(){ int N, M; cin >> N >> M; vector V(N); for (int i = 0; i < N; i++){ cin >> V[i]; } vector S(N); for (int i = 0; i < N; i++){ cin >> S[i]; } vector A(N, 0); for (int i = 0; i < N; i++){ for (int j = 0; j < M; j++){ if (S[i][j] == 'o'){ A[i] |= 1 << j; } } } vector zeta(1 << M, 0); for (int i = 0; i < N; i++){ zeta[A[i]] += V[i]; } for (int i = 0; i < M; i++){ for (int j = 0; j < (1 << M); j++){ if ((j >> i & 1) == 1){ zeta[j] += zeta[j - (1 << i)]; } } } vector dp(1 << M, 0); for (int i = 0; i < (1 << M); i++){ for (int j = 0; j < M; j++){ if ((i >> j & 1) == 0){ int i2 = i | (1 << j); int S = zeta[(1 << M) - 1 - i] - zeta[(1 << M) - 1 - i2]; dp[i2] = max(dp[i2], dp[i] + (long long) S * S); } } } cout << dp[(1 << M) - 1] << endl; }