#include<iostream>
#include<string>
using namespace std;
const int N = 10, D = 210, M = 5e4 + 10;
int n, d, pow2[N], pow6[N], f[D][6][M], ans = -1;
string s;
int get(int x, int y){
return x / pow6[y] % 6;
}
void merge(int ni, int nj, int lj, int nk, int w){
for(int ii = 0; ii < n; ii++){
if(get(nk, ii) == 0){
int t = nk, cnt = 0, nw = w;
t += nw * pow6[ii];
if(ii != 0 && ii != n-1 && get(t, ii-1) == nw && get(t, ii+1) == nw){
t -= nw * pow6[ii-1] + nw * pow6[ii] + nw * pow6[ii+1];
cnt += pow2[nw] * 3; nw++;
if(nw <= 5){
t += nw * pow6[ii];
}
}
if(ii != 0 && get(t, ii-1) == nw){
t -= nw * pow6[ii-1] + nw * pow6[ii];
cnt += pow2[nw] * 2; nw++;
if(nw <= 5){
t += nw * pow6[ii];
}
}
if(ii != n-1 && get(t, ii+1) == nw){
t -= nw * pow6[ii+1] + nw * pow6[ii];
cnt += pow2[nw] * 2; nw++;
if(nw <= 5){
t += nw * pow6[ii];
}
}
if(ii != 0 && get(t, ii-1) == nw){
t -= nw * pow6[ii-1] + nw * pow6[ii];
cnt += pow2[nw] * 2; nw++;
if(nw <= 5){
t += nw * pow6[ii];
}
}
f[ni+1][nj][t] = max(f[ni+1][nj][t], f[ni][lj][nk] + cnt);
if(ni == d*2-1) ans = max(ans, f[ni][lj][nk] + cnt);
}
}
}
int main(){
cin >> n >> d >> s;
pow6[0] = 1;
for(int i = 1; i <= n; i++) pow6[i] = pow6[i-1] * 6;
pow2[0] = 1;
for(int i = 1; i <= 5; i++) pow2[i] = pow2[i-1] * 2;
for(int i = 0; i < D; i++){
for(int j = 0; j < 6; j++){
for(int k = 0; k < M; k++) f[i][j][k] = -1;
}
}
f[0][0][0] = 0;
for(int i = 0; i < d*2; i++){
for(int j = 0; j < 6; j++){
for(int k = 0; k < pow6[n]-1; k++){
if(i & 1){
if(f[i][j][k] != -1){
f[i+1][j][k] = f[i][j][k];
if(j != 0) merge(i, 0, j, k, j);
}
}
else{
if(f[i][j][k] != -1){
int w = s[i/2] - '0';
if(j == 0){
f[i+1][w][k] = max(f[i+1][w][k], f[i][j][k]);
if(i == d-1) ans = max(ans, f[i][j][k]);
}
merge(i, j, j, k, w);
}
}
}
}
}
cout << ans;
return 0;
}