const int MAXN = 2000005;
struct SAM {
int tot, lst, len[MAXN], cnt[MAXN], nxt[MAXN][26], fa[MAXN];
vector<int> e[MAXN];
SAM() {
tot = lst = 1;
}
void add(char c) {
int u = ++tot, p = lst;
len[u] = len[lst] + 1, cnt[u] = 1, lst = u;
for(; p && !nxt[p][c - 'a']; nxt[p][c - 'a'] = u, p = fa[p]) {
}
if(!p) {
fa[u] = 1;
}else {
int q = nxt[p][c - 'a'];
if(len[q] == len[p] + 1) {
fa[u] = q;
}else {
int v = ++tot;
len[v] = len[p] + 1, fa[v] = fa[q], fa[u] = fa[q] = v;
for(; p && nxt[p][c - 'a'] == q; nxt[p][c - 'a'] = v, p = fa[p]) {
}
for(int i = 0; i < 26; nxt[v][i] = nxt[q][i], ++i) {
}
}
}
}
void build() {
for(int i = 2; i <= tot; ++i) {
e[fa[i]].emplace_back(i);
}
}
}sam;