#include <bits/stdc++.h>
using namespace std;
#define _rep(i_,a_,b_) for(int i_ = (a_); i_ <= (b_); ++i_)
#define mid ((L+R) >> 1)
#define multiCase() int testCnt = in(); _rep(curCase,1,testCnt)
#ifdef ONLINE_JUDGE
#define debug(...) 0
#else
#define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
#endif
using ll = long long;
using pii = pair<int,int>;
int in(void) { int x; scanf("%d", &x); return x; } ll inl(void) { ll x; scanf("%lld", &x); return x; }
void out(int x) { printf("%d ", x); } void outln(int x) { printf("%d\n", x); }
void out(ll x) { printf("%lld ", x); } void outln(ll x) { printf("%lld\n", x); }
template<typename T> void chkmax(T &a, const T &b) { a = max(a, b); }
template<typename T> void chkmin(T &a, const T &b) { a = min(a, b); }
const int kN = 305000;
int a[kN], sigm, n; char s[kN];
int cnt[kN], x[kN], y[kN], sa[kN]; //, rk[kN];
void SA(void) {
int m = n + 5;
_rep(i,1,n) ++cnt[x[i] = a[i]];
_rep(i,1,m) cnt[i] += cnt[i - 1];
_rep(i,1,n) sa[cnt[x[i]]--] = i;
for(int k = 1; k <= n; k <<= 1) {
int top = 0;
_rep(i,n - k + 1,n) y[++top] = i;
_rep(i,1,n) if(sa[i] > k) y[++top] = sa[i] - k;
memset(cnt, 0, sizeof(cnt));
_rep(i,1,n) ++cnt[x[i]];
_rep(i,1,m) cnt[i] += cnt[i - 1];
for(int i = n; i; --i) sa[cnt[x[y[i]]]--] = y[i], y[i] = 0;
_rep(i,1,n) swap(x[i], y[i]);
x[sa[1]] = m = 1;
_rep(i,2,n) if(y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) x[sa[i]] = m; else x[sa[i]] = ++m;
}
}
const unsigned bas = 998244353;
unsigned hsh[kN], pw[kN];
unsigned gethash(int l, int r) { return hsh[r] - hsh[l - 1] * pw[r - l + 1]; }
vector<int> ans[kN];
void update(int l, int r, int k) {
ans[l].emplace_back(k);
ans[r + 1].emplace_back(-k);
}
int main() {
sigm = in(), n = in();
if(sigm == 26) {
scanf("%s", s + 1);
_rep(i,1,n) a[i] = s[i] - 'a' + 1;
} else {
_rep(i,1,n) a[i] = in();
}
vector<int> d;
_rep(i,1,n) d.push_back(a[i]);
sort(d.begin(), d.end()), d.erase(unique(d.begin(), d.end()), d.end());
_rep(i,1,n) a[i] = lower_bound(d.begin(), d.end(), a[i]) - d.begin() + 1;
a[++n] = d.size() + 1;
SA(); --n;
_rep(i,1,n) hsh[i] = hsh[i - 1] * bas + a[i];
pw[0] = 1; _rep(i,1,n) pw[i] = pw[i - 1] * bas;
update(1, n - sa[1] + 1, sa[1]);
// debug("i = 1\n, update(1, %d, %d)\n", n - sa[1] + 1, sa[1]);
int ctrl = n - sa[1] + 1, lst = 1;
_rep(i,2,n) {
debug("i = %d\n", i);
int u = sa[i];
if(u > sa[lst]) continue;
update(n - sa[lst] + 2, n - u + 1, u);
debug("update(%d, %d, %d)\n", n - sa[lst] + 2, n - u + 1, u);
int L = 1, R = ctrl, ans = -1;
while(L <= R) {
if(gethash(sa[lst], sa[lst] + mid - 1) == gethash(u, u + mid - 1)) ans = mid, L = mid + 1;
else R = mid - 1;
}
if(ans != -1) update(1, ans, u), debug("update(%d, %d, %d)\n", 1, ans, u);
ctrl = ans, lst = i;
}
multiset<int> f;
_rep(i,1,n) {
for(auto &v : ans[i]) if(v > 0) f.insert(v); else f.erase(f.find(-v));
out(*f.begin());
}
return 0;
}
input:
26 18
aabazaabaazaabaaaz
output:
1 1 15 15 6 12 12 6 6 6 6 6 6 1 1 1 1 1
望加强数据w。