#include <bits/stdc++.h>
using namespace std;
int read() {
  int a = 0;
  char c = getchar();
  bool f = 0;
  while (!isdigit(c)) {
    f = c == '-';
    c = getchar();
  }
  while (isdigit(c)) {
    a = a * 10 + c - 48;
    c = getchar();
  }
  return f ? -a : a;
}
const int _ = 1e5 + 11;
vector<int> nxt[_][2];
int N, C[_], ans;
long long num;
void addEd(int a, int b, int c) { nxt[a][c].push_back(b); }
int deg[_], dst[_], seq[_], cseq;
unsigned long long arr[_][50];
void build(int fir) {
  memset(deg, 0, sizeof(deg));
  cseq = 0;
  for (int i = 1; i <= N + 8; ++i) {
    for (auto t : nxt[i][0]) deg[t] += dst[t] == dst[i];
    for (auto t : nxt[i][1]) deg[t] += dst[t] == dst[i] + 1;
  }
  queue<int> q;
  q.push(fir);
  while (!q.empty()) {
    int t = q.front();
    q.pop();
    seq[++cseq] = t;
    for (int l = 0; l < 2; ++l)
      for (auto p : nxt[t][l])
        if (dst[p] == dst[t] + l && !--deg[p]) q.push(p);
  }
}
void solve(int size, vector<int> node, int fir, int mx) {
  memset(arr, 0, sizeof(arr));
  for (int i = 0; i < node.size(); ++i)
    arr[node[i]][i >> 6] |= 1ull << (i & 63);
  for (int i = 1; i <= cseq; ++i) {
    int t = seq[i];
    for (int l = 0; l < 2; ++l)
      for (auto p : nxt[t][l])
        if (dst[p] == dst[t] + l)
          for (int r = 0; r < 50; ++r) arr[p][r] |= arr[t][r];
  }
  long long cnt = 0;
  int val = node.size();
  for (int i = 1; i <= N && val == node.size(); ++i)
    if (dst[i] == mx) {
      int num = 0;
      for (int j = 0; j < 50; ++j) {
        num += __builtin_popcountll(arr[i][j]);
      }
      val = min(val, num);
    }
  if (val == node.size()) --mx;
  for (int i = 1; i <= N; ++i)
    if (dst[i] > mx)
      cnt += node.size();
    else if (dst[i] == mx) {
      int num = 0;
      for (int j = 0; j < 50; ++j) {
        num += __builtin_popcountll(arr[i][j]);
      }
      cnt += node.size() - num;
    }
  if (ans < mx) {
    ans = mx;
    num = 0;
  }
  if (ans == mx) num += cnt;
}
int main() {
  ios::sync_with_stdio(0);
  cin >> N;
  for (int i = 1; i <= N; ++i) {
    char c;
    cin >> c;
    C[i] = c - 'a' + 1;
    addEd(i, N + C[i], 0);
    addEd(N + C[i], i, 1);
  }
  for (int i = 2; i <= N; ++i) {
    addEd(i - 1, i, 1);
    addEd(i, i - 1, 1);
  }
  for (int i = 1; i <= 8; ++i) {
    memset(dst, 0x3f, sizeof(dst));
    dst[N + i] = 0;
    deque<int> q;
    q.push_back(N + i);
    int mx = 0;
    while (!q.empty()) {
      int t = q.front();
      q.pop_front();
      if (t <= N) mx = max(mx, dst[t]);
      for (auto r : nxt[t][0])
        if (dst[r] > dst[t]) {
          dst[r] = dst[t];
          q.push_front(r);
        }
      for (auto r : nxt[t][1])
        if (dst[r] > dst[t] + 1) {
          dst[r] = dst[t] + 1;
          q.push_back(r);
        }
    }
    vector<int> node;
    build(N + i);
    for (int j = 1; j <= N; ++j)
      if (C[j] == i) {
        node.push_back(j);
        if (node.size() == 64 * 50) {
          solve(64 * 50, node, N + i, mx);
          node.clear();
        }
      }
    if (node.size()) solve(node.size(), node, N + i, mx);
  }
  cout << ans << ' ' << num / 2;
  return 0;
}
