// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class T>
bool minimize(T &a, const T &b) {
if (a > b) return a = b, true;
return false;
}
template<class T>
bool maximize(T &a, const T &b) {
if (a < b) return a = b, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "kstring"
const int MOD = 1e9 + 2277;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 50000 + 5;
const int base = 311;
struct Suffix_Array {
const static int SIZE = 256;
int p[N], c[N], pn[N], cn[N], cnt[N], tempClass[20][N], pos[N], rmq[N][20];
string s;
int n, classes;
Suffix_Array() {
n = 0;
s = "";
}
void assignment(string _s) {
s = _s;
n = (int)_s.size();
memset(cnt, 0, sizeof cnt);
}
void prepare() {
for(char c : s) cnt[c]++;
FOR(i, 1, SIZE) cnt[i] += cnt[i - 1];
REP(i, n) p[--cnt[s[i]]] = i;
classes = c[p[0]] = 0;
FOR(i, 1, n - 1) {
if (s[p[i]] != s[p[i - 1]])
classes++;
c[p[i]] = classes;
}
}
void build_SA() {
REP(h, 20) if (MASK(h) < n) {
REP(i, n) tempClass[h][i] = c[i];
REP(i, n) {
pn[i] = p[i] - MASK(h);
if (pn[i] < 0) pn[i] += n;
}
fill(cnt, cnt + classes + 1, 0);
REP(i, n) cnt[c[pn[i]]]++;
FOR(i, 1, classes) cnt[i] += cnt[i - 1];
RED(i, n) {
int cur_class = c[pn[i]];
p[--cnt[cur_class]] = pn[i];
}
cn[p[0]] = classes = 0;
FOR(i, 1, n - 1) {
ii cur = mp(c[p[i]], c[(p[i] + MASK(h)) % n]);
ii pre = mp(c[p[i - 1]], c[(p[i - 1] + MASK(h)) % n]);
if (cur != pre) classes++;
cn[p[i]] = classes;
}
REP(i, n) c[i] = cn[i];
}
}
int LCP(int i, int j) {
int ans = 0;
RED(h, 20) if (MASK(h) < n && tempClass[h][i % n] == tempClass[h][j % n]) {
ans += MASK(h);
i += MASK(h);
j += MASK(h);
}
return ans;
}
void build_SuffixArray(string s) {
assignment(s);
prepare();
build_SA();
REP(i, n) pos[p[i]] = i;
REP(i, n - 1) rmq[i][0] = LCP(p[i], p[i + 1]);
FOR(j, 1, 19) for(int i = 0; i < n - MASK(j); i++)
rmq[i][j] = min(rmq[i][j - 1], rmq[i + MASK(j - 1)][j - 1]);
}
int lcp(int i, int j) {
if (i == j) return n;
i = pos[i-1]; j = pos[j-1];
if (i > j) swap(i, j);
j--;
int k = __lg(j - i + 1);
return min(rmq[i][k], rmq[j - MASK(k) + 1][k]);
}
} SA;
int n, d;
string s;
int hsh[N], power[N];
vector<long long> newHash[N];
int getHash(int l, int r) {
if (l > r) return 0;
return (hsh[r] - 1LL * hsh[l - 1] * power[r - l + 1] % MOD + MOD) % MOD;
}
long long eraseHash(int pos, int l, int r) {
int hashLeft = getHash(l, pos - 1);
int hashRight = getHash(pos + 1, r);
long long finalHsh = (1LL * hashLeft * power[r - pos] + hashRight);
return finalHsh;
}
void init(void) {
cin >> n >> d >> s;
SA.build_SuffixArray(s + "#");
s = " " + s;
power[0] = 1;
FOR(i, 1, n) {
power[i] = 1LL * power[i - 1] * base % MOD;
hsh[i] = (1LL * hsh[i - 1] * base + s[i]) % MOD;
}
}
void process(void) {
if (d == 0) {
map<int, int> cnt;
FOR(k, 1, n) {
cnt.clear();
for(int i = k; i <= n; i += k) cnt[getHash(i - k + 1, i)]++;
ll ans = 0;
for(auto x : cnt) ans += 1LL * x.se * (x.se - 1) / 2;
cout << ans << ' ';
}
} else {
int S = min(100, n);
FOR(k, 1, S) {
ll ans = 0;
FOR(i, 0, k) newHash[i].clear();
FOR(i, 1, n / k) {
int l = (i - 1) * k + 1;
int r = i * k;
newHash[0].push_back(getHash(l, r));
FOR(j, l, r) newHash[j - l + 1].push_back(eraseHash(j, l, r));
}
ll countSame = 0;
FOR(i, 0, k) {
sort(all(newHash[i]));
int cnt = 1;
FOR(j, 1, (int)newHash[i].size() - 1) {
if (newHash[i][j] == newHash[i][j - 1]) {
if (i == 0) countSame += cnt++;
else ans += cnt++;
} else cnt = 1;
}
}
ans -= 1LL * countSame * (k - 1);
cout << ans << ' ';
}
FOR(k, S + 1, n) {
int m = n / k;
ll ans = 0;
FOR(i, 1, m) FOR(j, i + 1, m) {
int l = (i - 1) * k + 1;
int u = (j - 1) * k + 1;
int same = SA.lcp(l, u);
if (same >= k) ans++;
else if (SA.lcp(l + same + 1, u + same + 1) >= k - same - 1) ans++;
}
cout << ans << ' ';
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
Ly8gfn4gaWNlYmVhciB+fgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwp0eXBlZGVmIHBhaXI8aW50LCBpaT4gaWlpOwoKdGVtcGxhdGU8Y2xhc3MgVD4KICAgIGJvb2wgbWluaW1pemUoVCAmYSwgY29uc3QgVCAmYikgewogICAgICAgIGlmIChhID4gYikgcmV0dXJuIGEgPSBiLCB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCnRlbXBsYXRlPGNsYXNzIFQ+CiAgICBib29sIG1heGltaXplKFQgJmEsIGNvbnN0IFQgJmIpIHsKICAgICAgICBpZiAoYSA8IGIpIHJldHVybiBhID0gYiwgdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpPShhKTsgaTw9KGIpOyArK2kpCiNkZWZpbmUgRk9SUihpLGEsYikgZm9yKGludCBpPShhKTsgaT49KGIpOyAtLWkpCiNkZWZpbmUgUkVQKGksIG4pIGZvcihpbnQgaT0wOyBpPChuKTsgKytpKQojZGVmaW5lIFJFRChpLCBuKSBmb3IoaW50IGk9KG4pLTE7IGk+PTA7IC0taSkKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIEJJVChTLCBpKSAoKChTKSA+PiAoaSkpICYgMSkKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2RlZmluZSB0YXNrICJrc3RyaW5nIgoKY29uc3QgaW50IE1PRCA9IDFlOSArIDIyNzc7CmNvbnN0IGludCBpbmYgPSAxZTkgKyAyNzA5MjAwODsKY29uc3QgbGwgSU5GID0gMWUxOCArIDI3MDkyMDA4Owpjb25zdCBpbnQgTiA9IDUwMDAwICsgNTsKY29uc3QgaW50IGJhc2UgPSAzMTE7CnN0cnVjdCBTdWZmaXhfQXJyYXkgewogICAgY29uc3Qgc3RhdGljIGludCBTSVpFID0gMjU2OwogICAgaW50IHBbTl0sIGNbTl0sIHBuW05dLCBjbltOXSwgY250W05dLCB0ZW1wQ2xhc3NbMjBdW05dLCBwb3NbTl0sIHJtcVtOXVsyMF07CiAgICBzdHJpbmcgczsKICAgIGludCBuLCBjbGFzc2VzOwoKICAgIFN1ZmZpeF9BcnJheSgpIHsKICAgICAgICBuID0gMDsKICAgICAgICBzID0gIiI7CiAgICB9CgogICAgdm9pZCBhc3NpZ25tZW50KHN0cmluZyBfcykgewogICAgICAgIHMgPSBfczsKICAgICAgICBuID0gKGludClfcy5zaXplKCk7CiAgICAgICAgbWVtc2V0KGNudCwgMCwgc2l6ZW9mIGNudCk7CiAgICB9CgogICAgdm9pZCBwcmVwYXJlKCkgewogICAgICAgIGZvcihjaGFyIGMgOiBzKSBjbnRbY10rKzsKICAgICAgICBGT1IoaSwgMSwgU0laRSkgY250W2ldICs9IGNudFtpIC0gMV07CiAgICAgICAgUkVQKGksIG4pIHBbLS1jbnRbc1tpXV1dID0gaTsKICAgICAgICBjbGFzc2VzID0gY1twWzBdXSA9IDA7CiAgICAgICAgRk9SKGksIDEsIG4gLSAxKSB7CiAgICAgICAgICAgIGlmIChzW3BbaV1dICE9IHNbcFtpIC0gMV1dKQogICAgICAgICAgICAgICAgY2xhc3NlcysrOwogICAgICAgICAgICBjW3BbaV1dID0gY2xhc3NlczsKICAgICAgICB9CiAgICB9CgogICAgIHZvaWQgYnVpbGRfU0EoKSB7CiAgICAgICAgUkVQKGgsIDIwKSBpZiAoTUFTSyhoKSA8IG4pIHsKICAgICAgICAgICAgUkVQKGksIG4pIHRlbXBDbGFzc1toXVtpXSA9IGNbaV07CiAgICAgICAgICAgIFJFUChpLCBuKSB7CiAgICAgICAgICAgICAgICBwbltpXSA9IHBbaV0gLSBNQVNLKGgpOwogICAgICAgICAgICAgICAgaWYgKHBuW2ldIDwgMCkgcG5baV0gKz0gbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaWxsKGNudCwgY250ICsgY2xhc3NlcyArIDEsIDApOwogICAgICAgICAgICBSRVAoaSwgbikgY250W2NbcG5baV1dXSsrOwogICAgICAgICAgICBGT1IoaSwgMSwgY2xhc3NlcykgY250W2ldICs9IGNudFtpIC0gMV07CgogICAgICAgICAgICBSRUQoaSwgbikgewogICAgICAgICAgICAgICAgaW50IGN1cl9jbGFzcyA9IGNbcG5baV1dOwogICAgICAgICAgICAgICAgcFstLWNudFtjdXJfY2xhc3NdXSA9IHBuW2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNuW3BbMF1dID0gY2xhc3NlcyA9IDA7CiAgICAgICAgICAgIEZPUihpLCAxLCBuIC0gMSkgewogICAgICAgICAgICAgICAgaWkgY3VyID0gbXAoY1twW2ldXSwgY1socFtpXSArIE1BU0soaCkpICUgbl0pOwogICAgICAgICAgICAgICAgaWkgcHJlID0gbXAoY1twW2kgLSAxXV0sIGNbKHBbaSAtIDFdICsgTUFTSyhoKSkgJSBuXSk7CiAgICAgICAgICAgICAgICBpZiAoY3VyICE9IHByZSkgY2xhc3NlcysrOwogICAgICAgICAgICAgICAgY25bcFtpXV0gPSBjbGFzc2VzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBSRVAoaSwgbikgY1tpXSA9IGNuW2ldOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgTENQKGludCBpLCBpbnQgaikgewogICAgICAgIGludCBhbnMgPSAwOwogICAgICAgIFJFRChoLCAyMCkgaWYgKE1BU0soaCkgPCBuICYmIHRlbXBDbGFzc1toXVtpICUgbl0gPT0gdGVtcENsYXNzW2hdW2ogJSBuXSkgewogICAgICAgICAgICBhbnMgKz0gTUFTSyhoKTsKICAgICAgICAgICAgaSArPSBNQVNLKGgpOwogICAgICAgICAgICBqICs9IE1BU0soaCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnM7CiAgICB9CgogICAgdm9pZCBidWlsZF9TdWZmaXhBcnJheShzdHJpbmcgcykgewogICAgICAgIGFzc2lnbm1lbnQocyk7CiAgICAgICAgcHJlcGFyZSgpOwogICAgICAgIGJ1aWxkX1NBKCk7CiAgICAgICAgUkVQKGksIG4pIHBvc1twW2ldXSA9IGk7CiAgICAgICAgUkVQKGksIG4gLSAxKSBybXFbaV1bMF0gPSBMQ1AocFtpXSwgcFtpICsgMV0pOwogICAgICAgIEZPUihqLCAxLCAxOSkgZm9yKGludCBpID0gMDsgaSA8IG4gLSBNQVNLKGopOyBpKyspCiAgICAgICAgICAgIHJtcVtpXVtqXSA9IG1pbihybXFbaV1baiAtIDFdLCBybXFbaSArIE1BU0soaiAtIDEpXVtqIC0gMV0pOwogICAgfQoKICAgIGludCBsY3AoaW50IGksIGludCBqKSB7CiAgICAgICAgaWYgKGkgPT0gaikgcmV0dXJuIG47CiAgICAgICAgaSA9IHBvc1tpLTFdOyBqID0gcG9zW2otMV07CiAgICAgICAgaWYgKGkgPiBqKSBzd2FwKGksIGopOwogICAgICAgIGotLTsKICAgICAgICBpbnQgayA9IF9fbGcoaiAtIGkgKyAxKTsKICAgICAgICByZXR1cm4gbWluKHJtcVtpXVtrXSwgcm1xW2ogLSBNQVNLKGspICsgMV1ba10pOwogICAgfQp9IFNBOwoKaW50IG4sIGQ7CnN0cmluZyBzOwppbnQgaHNoW05dLCBwb3dlcltOXTsKdmVjdG9yPGxvbmcgbG9uZz4gbmV3SGFzaFtOXTsKCmludCBnZXRIYXNoKGludCBsLCBpbnQgcikgewogICAgaWYgKGwgPiByKSByZXR1cm4gMDsKICAgIHJldHVybiAoaHNoW3JdIC0gMUxMICogaHNoW2wgLSAxXSAqIHBvd2VyW3IgLSBsICsgMV0gJSBNT0QgKyBNT0QpICUgTU9EOwp9Cgpsb25nIGxvbmcgZXJhc2VIYXNoKGludCBwb3MsIGludCBsLCBpbnQgcikgewogICAgaW50IGhhc2hMZWZ0ID0gZ2V0SGFzaChsLCBwb3MgLSAxKTsKICAgIGludCBoYXNoUmlnaHQgPSBnZXRIYXNoKHBvcyArIDEsIHIpOwogICAgbG9uZyBsb25nIGZpbmFsSHNoID0gKDFMTCAqIGhhc2hMZWZ0ICogcG93ZXJbciAtIHBvc10gKyBoYXNoUmlnaHQpOwogICAgcmV0dXJuIGZpbmFsSHNoOwp9Cgp2b2lkIGluaXQodm9pZCkgewogICAgY2luID4+IG4gPj4gZCA+PiBzOwogICAgU0EuYnVpbGRfU3VmZml4QXJyYXkocyArICIjIik7CiAgICBzID0gIiAiICsgczsKICAgIHBvd2VyWzBdID0gMTsKICAgIEZPUihpLCAxLCBuKSB7CiAgICAgICAgcG93ZXJbaV0gPSAxTEwgKiBwb3dlcltpIC0gMV0gKiBiYXNlICUgTU9EOwogICAgICAgIGhzaFtpXSA9ICgxTEwgKiBoc2hbaSAtIDFdICogYmFzZSArIHNbaV0pICUgTU9EOwogICAgfQp9Cgp2b2lkIHByb2Nlc3Modm9pZCkgewogICAgaWYgKGQgPT0gMCkgewogICAgICAgIG1hcDxpbnQsIGludD4gY250OwogICAgICAgIEZPUihrLCAxLCBuKSB7CiAgICAgICAgICAgIGNudC5jbGVhcigpOwogICAgICAgICAgICBmb3IoaW50IGkgPSBrOyBpIDw9IG47IGkgKz0gaykgY250W2dldEhhc2goaSAtIGsgKyAxLCBpKV0rKzsKICAgICAgICAgICAgbGwgYW5zID0gMDsKICAgICAgICAgICAgZm9yKGF1dG8geCA6IGNudCkgYW5zICs9IDFMTCAqIHguc2UgKiAoeC5zZSAtIDEpIC8gMjsKICAgICAgICAgICAgY291dCA8PCBhbnMgPDwgJyAnOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgaW50IFMgPSBtaW4oMTAwLCBuKTsKICAgICAgICBGT1IoaywgMSwgUykgewogICAgICAgICAgICBsbCBhbnMgPSAwOwogICAgICAgICAgICBGT1IoaSwgMCwgaykgbmV3SGFzaFtpXS5jbGVhcigpOwogICAgICAgICAgICBGT1IoaSwgMSwgbiAvIGspIHsKICAgICAgICAgICAgICAgIGludCBsID0gKGkgLSAxKSAqIGsgKyAxOwogICAgICAgICAgICAgICAgaW50IHIgPSBpICogazsKICAgICAgICAgICAgICAgIG5ld0hhc2hbMF0ucHVzaF9iYWNrKGdldEhhc2gobCwgcikpOwogICAgICAgICAgICAgICAgRk9SKGosIGwsIHIpIG5ld0hhc2hbaiAtIGwgKyAxXS5wdXNoX2JhY2soZXJhc2VIYXNoKGosIGwsIHIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsbCBjb3VudFNhbWUgPSAwOwogICAgICAgICAgICBGT1IoaSwgMCwgaykgewogICAgICAgICAgICAgICAgc29ydChhbGwobmV3SGFzaFtpXSkpOwogICAgICAgICAgICAgICAgaW50IGNudCA9IDE7CiAgICAgICAgICAgICAgICBGT1IoaiwgMSwgKGludCluZXdIYXNoW2ldLnNpemUoKSAtIDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGFzaFtpXVtqXSA9PSBuZXdIYXNoW2ldW2ogLSAxXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSBjb3VudFNhbWUgKz0gY250Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYW5zICs9IGNudCsrOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBjbnQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucyAtPSAxTEwgKiBjb3VudFNhbWUgKiAoayAtIDEpOwogICAgICAgICAgICBjb3V0IDw8IGFucyA8PCAnICc7CiAgICAgICAgfQoKICAgICAgICBGT1IoaywgUyArIDEsIG4pIHsKICAgICAgICAgICAgaW50IG0gPSBuIC8gazsKICAgICAgICAgICAgbGwgYW5zID0gMDsKICAgICAgICAgICAgRk9SKGksIDEsIG0pIEZPUihqLCBpICsgMSwgbSkgewogICAgICAgICAgICAgICAgaW50IGwgPSAoaSAtIDEpICogayArIDE7CiAgICAgICAgICAgICAgICBpbnQgdSA9IChqIC0gMSkgKiBrICsgMTsKCiAgICAgICAgICAgICAgICBpbnQgc2FtZSA9IFNBLmxjcChsLCB1KTsKICAgICAgICAgICAgICAgIGlmIChzYW1lID49IGspIGFucysrOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoU0EubGNwKGwgKyBzYW1lICsgMSwgdSArIHNhbWUgKyAxKSA+PSBrIC0gc2FtZSAtIDEpIGFucysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvdXQgPDwgYW5zIDw8ICcgJzsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKHRhc2siLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKHRhc2siLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4odGFzayIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgaW50IHRjID0gMTsKLy8gICAgY2luID4+IHRjOwogICAgd2hpbGUodGMtLSkgewogICAgICAgIGluaXQoKTsKICAgICAgICBwcm9jZXNzKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=