func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e6 + 7;   const int mod = 51123987;   const int inv2 = mod + 1 >> 1;   struct Edge {     int to, last, v;   } E[maxn];   int fa[maxn];   int len[maxn];   int dep[maxn];   int head[maxn];   int tot;   int last;   int cnt;   int n;   char s[maxn];   int pre[maxn];   long long suf[maxn];   void Init() {     for (int i = 0; i <= tot; ++i) {       fa[i] = len[i] = dep[i] = 0;       head[i] = 0;     }     cnt = 0;     fa[last = 0] = fa[tot = 1] = 1;     len[1] = -1;   }   int Getfail(int x, int ed) {     while (s[ed] ^ s[ed - len[x] - 1]) x = fa[x];     return x;   }   int Check(int x, int v) {     for (int i = head[x], y; y = E[i].to, i; i = E[i].last)       if (E[i].v == v) return E[i].to;     return 0;   }   void Adde(int x, int y, int z) {     E[++cnt] = (Edge){y, head[x], z};     head[x] = cnt;   }   void Extend(int x, int ed) {     int p = Getfail(last, ed);     int np = Check(p, x);     if (!np) {       np = ++tot;       int pp = Getfail(fa[p], ed);       fa[np] = Check(pp, x);       Adde(p, np, x);       len[np] = len[p] + 2;       dep[np] = dep[fa[np]] + 1;     }     last = np;   }   int main() {     Init();     scanf( %d , &n);     scanf( %s , s + 1);     for (int i = 1; i <= n; ++i) Extend(s[i] -  a , i), pre[i] = dep[last];     Init();     reverse(s + 1, s + n + 1);     for (int i = 1; i <= n; ++i)       Extend(s[i] -  a , i), suf[n - i + 1] = dep[last];     for (int i = n; i; --i) suf[i] += suf[i + 1], suf[i] %= mod;     int ans = 0;     for (int i = 1; i <= n; ++i) (ans += 1LL * pre[i] * suf[i + 1] % mod) %= mod;     int sum = 1LL * suf[1] * (suf[1] - 1) / 2 % mod;     ans = (sum - ans) % mod;     ans < 0 ? ans += mod : 0;     printf( %d n , ans);     return 0;   }   