#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
int n, m;
string s;
int adj[26][26]; // adj[u][v] = Số vị trí mà hai kí tự u và v nằm kề nhau
int dp[1 << 20]; // dp[mask] = Độ trễ của Hoán vị của các chữ cái trong tập mask mà có độ trễ nhỏ nhất
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
cin >> s;
for (int i = 0; i + 1 < n; i++) {
int u = s[i] - 'a', v = s[i + 1] - 'a';
adj[u][v]++;
adj[v][u]++;
}
for (int mask = 0; mask < (1 << m); mask++) dp[mask] = INF;
dp[0] = 0;
for (int mask = 0; mask < (1 << m); mask++) {
// pos là vị trí hiện tại cần xét
int pos = __builtin_popcount(mask);
for (int c = 0; c < m; c++) { // kí tự sẽ điền vào vị trí pos
if ((mask >> c) & 1) continue;
int next_mask = mask | (1 << c);
int cost = 0;
for (int c1 = 0; c1 < m; c1++) {
if (c1 == c) continue;
if ((mask >> c1) & 1) {
cost += adj[c][c1] * pos;
}
else {
cost -= adj[c][c1] * pos;
}
}
minimize(dp[next_mask], dp[mask] + cost);
}
}
cout << dp[(1 << m) - 1] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBtaW5pbWl6ZShUJiBhLCBjb25zdCBUJiBiKSB7CglpZiAoYiA8IGEpIGEgPSBiOyAKfQoKaW50IG4sIG07ICAKc3RyaW5nIHM7ICAKaW50IGFkalsyNl1bMjZdOyAvLyBhZGpbdV1bdl0gPSBT4buRIHbhu4sgdHLDrSBtw6AgaGFpIGvDrSB04buxIHUgdsOgIHYgbuG6sW0ga+G7gSBuaGF1CmludCBkcFsxIDw8IDIwXTsgLy8gZHBbbWFza10gPSDEkOG7mSB0cuG7hSBj4bunYSBIb8OhbiB24buLIGPhu6dhIGPDoWMgY2jhu68gY8OhaSB0cm9uZyB04bqtcCBtYXNrIG3DoCBjw7MgxJHhu5kgdHLhu4Ugbmjhu48gbmjhuqV0CgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbiA+PiBtOyAKCWNpbiA+PiBzOyAKCglmb3IgKGludCBpID0gMDsgaSArIDEgPCBuOyBpKyspIHsKCQlpbnQgdSA9IHNbaV0gLSAnYScsIHYgPSBzW2kgKyAxXSAtICdhJzsgCgkJYWRqW3VdW3ZdKys7IAoJCWFkalt2XVt1XSsrOyAKCX0KCglmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG0pOyBtYXNrKyspIGRwW21hc2tdID0gSU5GOyAgCglkcFswXSA9IDA7ICAgCgoJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBtKTsgbWFzaysrKSB7CgkJLy8gcG9zIGzDoCB24buLIHRyw60gaGnhu4duIHThuqFpIGPhuqduIHjDqXQKCQlpbnQgcG9zID0gX19idWlsdGluX3BvcGNvdW50KG1hc2spOyAKCQlmb3IgKGludCBjID0gMDsgYyA8IG07IGMrKykgeyAvLyBrw60gdOG7sSBz4bq9IMSRaeG7gW4gdsOgbyB24buLIHRyw60gcG9zCgkJCWlmICgobWFzayA+PiBjKSAmIDEpIGNvbnRpbnVlOyAKCQkJaW50IG5leHRfbWFzayA9IG1hc2sgfCAoMSA8PCBjKTsgCgkJCWludCBjb3N0ID0gMDsgIAoJCQlmb3IgKGludCBjMSA9IDA7IGMxIDwgbTsgYzErKykgewoJCQkJaWYgKGMxID09IGMpIGNvbnRpbnVlOyAgIAoJCQkJaWYgKChtYXNrID4+IGMxKSAmIDEpIHsKCQkJCQljb3N0ICs9IGFkaltjXVtjMV0gKiBwb3M7ICAKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWNvc3QgLT0gYWRqW2NdW2MxXSAqIHBvczsgCgkJCQl9CgkJCX0KCQkJbWluaW1pemUoZHBbbmV4dF9tYXNrXSwgZHBbbWFza10gKyBjb3N0KTsgCgkJfQoJfQoKCWNvdXQgPDwgZHBbKDEgPDwgbSkgLSAxXSA8PCAnXG4nOyAKfQo=