#include<vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
inline int read() {
int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}
const int N = 1000100;
char A[N];
int p[N];
int main() {
int n; cin >> n;
scanf("%s",A+1);
p[1] = 0;
for (int i=2; i<=n; ++i) {
int j = p[i-1];
while (j && A[i]!=A[j+1]) j = p[j];
if (A[i] == A[j+1]) j++;
p[i] = j;
}
LL ans = 0;
for (int i=1; i<=n; ++i) {
int j = i;
while (p[j]) j = p[j]; // 这里看到这样写的p[p[j]],其实每个p[i]在下面已经更新了,不需要跳很多次。
if (p[i] != 0) p[i] = j; // 类似于记忆化,前缀i的跳的最优位置。
ans += i - j;
}
cout << ans;
return 0;
}