func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 2000005;   char str[MAXN];   struct Palindromic_Tree {     vector<pair<int, int>> next[MAXN];     int fail[MAXN];     int cnt[MAXN];     int num[MAXN];     int len[MAXN];     int S[MAXN];     int last;     int n;     int p;     int newnode(int l) {       next[p].clear();       cnt[p] = 0;       num[p] = 0;       len[p] = l;       return p++;     }     void init() {       p = 0;       next[0].clear();       next[1].clear();       newnode(0);       newnode(-1);       last = 0;       n = 0;       S[n] = -1;       fail[0] = 1;     }     int get_fail(int x) {       while (S[n - len[x] - 1] != S[n]) x = fail[x];       return x;     }     int find(int cur, int c) {       for (int i = 0; i < next[cur].size(); i++) {         if (next[cur][i].first == c) return next[cur][i].second;       }       return 0;     }     int add(int c) {       c -=  a ;       S[++n] = c;       int cur = get_fail(last);       int k = find(cur, c);       if (k == 0) {         int now = newnode(len[cur] + 2);         fail[now] = find(get_fail(fail[cur]), c);         next[cur].push_back(make_pair(c, now));         num[now] = num[fail[now]] + 1;       }       last = find(cur, c);       cnt[last]++;       return num[last];     }     void count() {       for (int i = p - 1; i >= 0; --i) cnt[fail[i]] += cnt[i];     }   } tree;   long long head[MAXN], tail[MAXN];   int main() {     int n;     while (~scanf( %d , &n)) {       memset(head, 0, sizeof(head));       memset(tail, 0, sizeof(tail));       scanf( %s , str + 1);       tree.init();       for (int i = 1; i <= n; i++) {         tail[i] = tree.add(str[i]);       }       tree.init();       for (int i = n; i >= 1; i--) {         head[i] = ((head[i + 1] + tree.add(str[i])) % 51123987) % 51123987;       }       long long ans = head[1] * (head[1] - 1) / 2 % 51123987;       for (int i = 2; i <= n; i++)         ans = (ans - tail[i - 1] * head[i] % 51123987) % 51123987;       ans = (ans + 51123987) % 51123987;       printf( %lld n , ans);     }     return 0;   }   