/**
* author: sunkuangzheng
* created: 24.01.2024 15:12:52
**/
#include<bits/stdc++.h>
#ifdef DEBUG_LOCAL
#include <mydebug/debug.h>
#endif
using ll = long long;
const int N = 2e6+5;
using namespace std;
int T,n,m,sa[N],rk[N],ok[N],h[N],st[22][N];string s;
void los(){
cin >> n >> s,s = s + '#' + string(s.rbegin(),s.rend());
for(int i = n + 1;i < s.size();i ++) s[i] ^= 1;
auto SA = [&](string &s,int &n){
s = " " + s,n = s.size() - 1;
for(int i = 1;i <= n;i ++) sa[i] = i,rk[i] = s[i];
for(int j = 1;j < n;j *= 2){
for(int i = 1;i <= n;i ++) ok[i] = rk[i]; int p = 0;
sort(sa+1,sa+n+1,[&](int x,int y){return rk[x] < rk[y] || rk[x] == rk[y] && rk[x + j] < rk[y + j];});
auto cmp = [&](int x,int y){return ok[x] == ok[y] && ok[x + j] == ok[y + j];};
for(int i = 1;i <= n;i ++) if(cmp(sa[i],sa[i-1])) rk[sa[i]] = p; else rk[sa[i]] = ++p;
}for(int i = 1,k = 0;i <= n;h[rk[i ++]] = k) for(k --,k = max(k,0);s[i + k] == s[sa[rk[i] - 1] + k];k ++);
for(int i = 1;i <= n;i ++) st[0][i] = h[i];
for(int j = 1;j <= __lg(n);j ++) for(int i = 1;i + (1 << j) - 1 <= n;i ++)
st[j][i] = min(st[j-1][i],st[j-1][i + (1 << j - 1)]);
};SA(s,m);
auto lcp = [&](int i,int j){
if(i = rk[i],j = rk[j],i > j) swap(i,j); assert(i != j);
int k = __lg(j - i);
return min(st[k][i+1],st[k][j-(1<<k)+1]);
};auto get = [&](int i){return n + 2 + n - i;};
ll ans = 0;
for(int i = 1;i < n;i ++) ans += lcp(get(i),i + 1);
cout << ans;
}int main(){
ios::sync_with_stdio(0),cin.tie(0);
for(T = 1;T --;) los();
}