#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
void qread(int &x) {
  int neg = 1;
  x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = 10 * x + c - '0', c = getchar();
  x *= neg;
}
const int maxn = 2000005;
const int mod = 51123987;
int n;
char c[maxn];
string s, t;
long long sum[maxn];
namespace Eertree {
int ss[maxn];
int tot, tote, imag, zero, last, m;
class node {
 public:
  int len, suf, id, cnt;
  node(int _len = 0, int _suf = 0, int _id = 0)
      : len(_len), suf(_suf), id(_id) {
    cnt = 0;
  }
} t[maxn];
int head[maxn], to[maxn], nxt[maxn], ch[maxn];
int newnode(int _len, int _suf, int _id) {
  tot++;
  head[tot] = 0;
  t[tot] = node(_len, _suf, _id);
  return tot;
}
void addedge(int u, int v, int c) {
  tote++;
  to[tote] = v;
  nxt[tote] = head[u];
  ch[tote] = c;
  head[u] = tote;
}
void init() {
  m = tot = tote = 0;
  ss[0] = 26;
  imag = newnode(-1, 1, 0);
  zero = newnode(0, 1, 0);
  last = zero;
}
int add(int c) {
  ss[++m] = c;
  while (ss[m] != ss[m - 1 - t[last].len]) last = t[last].suf;
  int cur = 0;
  for (int i = head[last]; i; i = nxt[i]) {
    if (ch[i] == c) {
      cur = to[i];
      break;
    }
  }
  if (!cur) {
    int tmp = t[last].suf;
    while (ss[m] != ss[m - 1 - t[tmp].len]) tmp = t[tmp].suf;
    if (last == imag)
      cur = newnode(t[last].len + 2, zero, m);
    else {
      for (int i = head[tmp]; i; i = nxt[i]) {
        if (ch[i] == c) {
          cur = newnode(t[last].len + 2, to[i], m);
          break;
        }
      }
    }
    t[cur].cnt = t[t[cur].suf].cnt + 1;
    addedge(last, cur, c);
  }
  last = cur;
  return t[last].cnt;
}
}  // namespace Eertree
int main() {
  scanf("%d%s", &n, c);
  Eertree::init();
  for (int i = n - 1; i >= 0; i--)
    sum[i] = (sum[i + 1] + Eertree::add(c[i] - 'a')) % mod;
  long long ans = 1LL * sum[0] * (sum[0] - 1) / 2 % mod;
  Eertree::init();
  for (int(i) = 0; (i) < n; i++) {
    int cur = Eertree::add(c[i] - 'a');
    ans = (ans - 1LL * cur * sum[i + 1] % mod + mod) % mod;
  }
  printf("%lld\n", ans);
  return 0;
}
