#include <bits/stdc++.h>
struct tree {
  int lz;
  long long msk;
  int idx;
};
char str[200200];
tree seg[200200 * 4];
void prop(int id, int l, int r) {
  if (seg[id].lz) {
    seg[id].idx += seg[id].lz;
    if (l != r - 1) {
      seg[(id << 1)].lz += seg[id].lz;
      seg[((id << 1) + 1)].lz += seg[id].lz;
    };
    seg[id].lz = 0;
  };
};
void build(int id, int l, int r) {
  if (l == r - 1) {
    seg[id].idx = l;
    seg[id].msk = (1ll << (str[l]));
  } else {
    int m = (l + r) >> 1;
    build((id << 1), l, m);
    build(((id << 1) + 1), m, r);
    seg[id].msk = seg[(id << 1)].msk | seg[((id << 1) + 1)].msk;
  };
};
void upd1(int id, int l, int r, int x) {
  prop(id, l, r);
  if (l == r - 1) {
    seg[id].msk = 0;
  } else {
    int m = (l + r) >> 1;
    if (m > x) {
      upd1((id << 1), l, m, x);
    } else {
      upd1(((id << 1) + 1), m, r, x);
    };
    seg[id].msk = seg[(id << 1)].msk | seg[((id << 1) + 1)].msk;
  };
};
void upd2(int id, int l, int r, int a, int b) {
  prop(id, l, r);
  if (l >= b || a >= r) return;
  if (a <= l && r <= b) {
    seg[id].lz -= 1;
    prop(id, l, r);
  } else {
    int m = (l + r) >> 1;
    upd2((id << 1), l, m, a, b);
    upd2(((id << 1) + 1), m, r, a, b);
    seg[id].msk = seg[(id << 1)].msk | seg[((id << 1) + 1)].msk;
  };
};
std::pair<int, int> qry(int id, int l, int r, int bc) {
  prop(id, l, r);
  if (l == r - 1) {
    std::pair<int, int> erg = {l, seg[id].idx};
    return erg;
  } else {
    int m = (l + r) >> 1;
    if (seg[((id << 1) + 1)].msk & (1ll << bc)) {
      return qry(((id << 1) + 1), m, r, bc);
    } else {
      return qry((id << 1), l, m, bc);
    };
  };
};
int main(void) {
  int n;
  scanf("%d", &n);
  scanf("%s", str);
  for (int i = 0; i < n; i++) {
    str[i] -= 'a';
  };
  build(1, 0, n);
  long long erg = 0;
  std::pair<int, int> tmp;
  for (int i = 0; i < n; i++) {
    tmp = qry(1, 0, n, str[i]);
    erg += n - i - 1 - tmp.second;
    upd1(1, 0, n, tmp.first);
    upd2(1, 0, n, tmp.first, n);
  };
  printf("%lld\n", erg);
  return 0;
};
