const int inf = 0x3f3f3f3f;
const int maxn = 100010;
struct Suffix_Tree{
int start[maxn << 1], len[maxn << 1], next[maxn << 1][27], link[maxn << 1];
int tot, now, rem, last, pos, root;
int text[maxn << 1];
int new_node(int st, int l = inf){
start[tot] = st;
len[tot] = l;
link[tot] = 0;
memset(next[tot], 0, sizeof(next[tot]));
return tot++;
}
void init(){
tot = now = rem = last = pos = 0;
root = new_node(0);
}
void extend(int c){
text[++pos] = c;
++rem;
last = 0;
while(rem){
while (rem > len[next[now][text[pos - rem + 1]]])
rem -= len[now = next[now][text[pos - rem + 1]]];
if(next[now][text[pos - rem + 1]] == 0){
int leaf = new_node(pos);
next[now][text[pos - rem + 1]] = leaf;
link[last] = now;
last = now;
}else{
int v = next[now][text[pos - rem + 1]];
if(text[start[v] + rem - 1] == c){
link[last] = now;
last = now;
break;
}
int split = new_node(start[v], rem - 1);
next[now][text[pos - rem + 1]] = split;
next[split][c] = new_node(pos);
next[split][text[start[v] + rem - 1]] = v;
start[v] += rem - 1;
len[v] -= rem - 1;
link[last] = split;
last = split;
}
if(!now) --rem;
else now = link[now];
}
}
};