题目链接:https://codeforces.com/contest/17/problem/E
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
static const int MAXN=2e6+10;
static const int MAXM=4e6+10;
static const int MOD=51123987;
char s[MAXN];
char s_new[MAXM];
int p[MAXM];
int h[MAXM],t[MAXM];
int n;
int init()
{
int len=strlen(s);
s_new[0]='$'; s_new[1]='#';
int j=2;
for (int i=0;i<len;i++)
{
s_new[j++]=s[i]; s_new[j++]='#';
}
s_new[j++]= '^'; s_new[j]='\0';
return j;
}
void manacher()
{
int len=init();
int max_len=-1;
int id,mx=0;
for (int i=1;i<len;i++)
{
if(i<mx) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++;
if(mx<i+p[i])
{
id=i; mx=i+p[i];
}
}
}
int main()
{
scanf("%d%s",&n,s);
manacher();
long long cnt=0;
for(int i=1;i<=2*n+1;i++)
{
h[i-p[i]+1]++; h[i+1]--;
t[i]++; t[i+p[i]]--;
cnt=(cnt+p[i]/2)%MOD;
}
for(int i=1;i<=2*n+1;i++) h[i]+=h[i-1],t[i]+=t[i-1];
cnt=cnt*(cnt-1)/2%MOD;
long long tott=0;
for(int i=2;i<=2*n-2;i+=2)
{
tott=(tott+t[i])%MOD;
cnt=(cnt-tott*h[i+2]%MOD)%MOD;
}
printf("%lld\n",(cnt+MOD)%MOD);
return 0;
}