#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <cstring>
#include <stack>
#include <sstream>
#include <queue>
#include <iomanip>
#include <cmath>
#include <unordered_map>
using namespace std;
#define forn(i, n) for(int i = 0; i < (n); ++i)
#define PATH "D:\\QtProjects\\olymp\\"
#define debug(x) cerr << "DEBUG " << #x << ": " << x << endl;
typedef long long ll;
typedef long double ld;
using namespace std;
const int N = 8002;
int h[N];
int ppow[N];
const int P = 263;
inline void init(){
ppow[0] = -1;
for (int i = 1; i < N; ++i)
ppow[i] = ppow[i - 1] * P;
}
inline void makeh(const string& s){
h[0] = 0;
forn(i, (int)s.size()) h[i+1] = h[i] * P + s[i];
}
inline int geth(const int l, const int r){
return h[r] + h[l] * ppow[r-l];
}
int k;
int pos;
string s;
inline int LCP(int l, int r){
l = l + pos;
r = r + pos;
if (s[l] != s[r]) return 0;
int xl = 1;
int xr = min(pos + k - l, pos + k - r);
while (xr - xl > 1){
int m = (xl + xr) / 2;
int h1 = geth(l, l + m);
int h2 = geth(r, r + m);
if (h1 == h2) xl = m;
else xr = m;
}
if (geth(l, l + xr) == geth(r, r + xr)) return xr;
else return xl;
}
inline int cmp(const int& l, const int& r){
int lcp = LCP(l, r);
if (l + lcp == k) return true;
if (r + lcp == k) return false;
return s[pos + l + lcp] < s[pos + r + lcp];
}
int suf[N];
inline void lolsort(){
for (int i = 0; suf[0] != 0; ++i){
if (suf[i] == 0) {
while (i != 0) {
suf[i] = suf[i - 1];
--i;
}
suf[0] = 0;
}
}
for (int i = 1; i < k; ++i) --suf[i];
suf[0] = k - 1;
for (int i = 1; i + 1 < k; ++i) if (!cmp(suf[i], suf[i+1])){
swap(suf[i], suf[i+1]);
}
bool swapped = true;
while(swapped){
swapped = false;
for (int i = 0; i + 1 < k; ++i) if (!cmp(suf[i], suf[i+1])){
swapped = true;
swap(suf[i], suf[i+1]);
}
}
//sort(suf, suf + k, cmp);
}
int main(){
//freopen(PATH"input.txt", "r", stdin);
ios_base::sync_with_stdio(false);
init();
s.reserve(8001);
cin >> k;
getline(cin, s); getline(cin, s);
int n = (int)s.size();
s += s;
makeh(s);
forn(i, k) suf[i] = i;
sort(suf, suf + k, cmp);
for (pos = 0; pos < n; ){
int cnt = k - suf[0];
for (int i = 1; i < k; ++i){
int lcp = LCP(suf[i-1], suf[i]);
cnt += k - suf[i] - lcp;
}
cout << cnt << ' ';
if (++pos < n) {
lolsort();
}
}
cout << endl;
return 0;
}