#include <bits/stdc++.h>   using namespace std;   long long int INF = 9223372036854775807;   const long long int mod = 1000000007;   long long int MOD(long long int a, long long int b) {     if (a > b)       return a - b;     else       return b - a;   }   long long int max3(long long int a, long long int b, long long int c) {     return max(c, max(a, b));   }   long long int min3(long long int a, long long int b, long long int c) {     return min(a, min(b, c));   }   long long int power(long long int x, long long int y) {     long long int res = 1;     while (y > 0) {       if (y & 1) res = (res * x);       y = y >> 1;       x = (x * x);     }     return res;   }   long long int power1(long long int x, long long int y) {     long long int res = 1;     while (y > 0) {       if (y & 1) res = (res * x) % mod;       y = y >> 1;       x = (x * x) % mod;     }     return res % mod;   }   long long int logg(long long int a) {     long long int x = 0;     while (a > 1) {       x++;       a /= 2;     }     return x;   }   long long int gcd(long long int a, long long int b) {     if (a == 0) return b;     return gcd(b % a, a);   }   long long int abso(long long int x) {     if (x < 0) {       return -x;     }     return x;   }   long long int ceiling(long long int a, long long int b) {     if (a % b == 0) {       return a / b;     } else {       return a / b + 1;     }   }   long long int modinv(long long int x) { return power1(x, mod - 2); }   vector<vector<int>> mat;   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     ;     int n, p;     cin >> n >> p;     mat.resize(p);     string str;     cin >> str;     for (int i = 0; i < p; i++) {       mat[i].resize(p);       for (int j = 0; j < p; j++) {         cin >> mat[i][j];       }     }     vector<vector<vector<int>>> pair_masks(p);     vector<int> cnt(p);     for (int i = 0; i < n; i++) {       cnt[str[i] -  a ]++;     }     for (int i = 0; i < p; i++) {       pair_masks[i].resize(p);       for (int j = 0; j < p; j++) {         pair_masks[i][j].resize(1 << p);       }     }     for (int i = 0; i < p; i++) {       for (int j = 0; j < p; j++) {         int prev = -1;         int mask = 0;         for (int k = 0; k < n; k++) {           if (str[k] ==  a  + i || str[k] ==  a  + j) {             if (prev == -1) {               prev = str[k] -  a ;               mask = 0;             } else {               if (i != j) {                 if (prev == str[k] -  a ) {                   mask = 0;                 } else {                   pair_masks[i][j][mask] = 1;                   prev = str[k] -  a ;                   mask = 0;                 }               } else {                 pair_masks[i][j][mask] = 1;                 prev = str[k] -  a ;                 mask = 0;               }             }           } else {             mask = mask | 1 << (str[k] -  a );           }         }       }     }     for (int i = 0; i < p; i++) {       for (int j = 0; j < p; j++) {         for (int m = 0; m < p; m++) {           for (int k = 0; k < (1 << p); k++) {             if (m != i && m != j) {               pair_masks[i][j][k | 1 << m] += pair_masks[i][j][k];             }           }         }       }     }     for (int i = 0; i < p; i++) {       for (int j = 0; j < p; j++) {         for (int k = 0; k < (1 << p); k++) {           pair_masks[i][j][k] = min(1, pair_masks[i][j][k]);         }       }     }     vector<int> dp(1 << p, 0);     dp[0] = 1;     for (int mask = 1; mask < (1 << p); mask++) {       bool c = false;       for (int i = 0; i < p; i++) {         for (int j = 0; j < p; j++) {           if (pair_masks[i][j][mask] && !mat[i][j]) {             c = true;             break;           }         }         if (c) {           break;         }       }       if (c) {         dp[mask] = 0;         continue;       }       for (int i = 0; i < p; i++) {         if (mask & (1 << i)) {           if (dp[mask ^ (1 << i)]) {             dp[mask] = 1;           }         }       }     }     int ans = n;     for (int mask = 0; mask < (1 << p); mask++) {       if (dp[mask]) {         int len = n;         for (int k = 0; k < p; k++) {           if (mask & 1 << k) {             len -= cnt[k];           }         }         ans = min(ans, len);       }     }     cout << ans;   }