#include<bits/stdc++.h>
const int maxn=100008;
int n,k;
int s[maxn];
int sa[maxn],rk[maxn],height[maxn],a[maxn],b[maxn],cnt[maxn];
inline void get_sa()
{
int m=1000;
int *rk_1=a,*sa_2=b,*tmp;
for(int i=1;i<=n;++i) ++cnt[rk_1[i]=s[i]];
for(int i=1;i<=m;++i) cnt[i]+=cnt[i-1];
for(int i=n;i;--i) sa[cnt[rk_1[i]]]=i,--cnt[rk_1[i]];
for(int k=1,p;k<=n;k<<=1,m=p){
p=0;
for(int i=n-k+1;i<=n;++i) sa_2[++p]=i;
for(int i=1;i<=n;++i) if(sa[i]>k) sa_2[++p]=sa[i]-k;
for(int i=1;i<=m;++i) cnt[i]=0;
for(int i=1;i<=n;++i) ++cnt[rk_1[sa_2[i]]];
for(int i=1;i<=m;++i) cnt[i]+=cnt[i-1];
for(int i=n;i;--i) sa[cnt[rk_1[sa_2[i]]]]=sa_2[i],--cnt[rk_1[sa_2[i]]];
tmp=sa_2;
p=1;
tmp[sa[1]]=1;
for(int i=2;i<=n;++i){
if(sa[i]+k<=n&&sa[i-1]+k<=n&&rk_1[sa[i]]==rk_1[sa[i-1]]&&rk_1[sa[i]+k]==rk_1[sa[i-1]+k]){
tmp[sa[i]]=p;
}
else{
tmp[sa[i]]=++p;
}
}
if(p==n) break;
swap(rk_1,sa_2);
}
}
inline void get_height()
{
int k=0;
for(int i=1;i<=n;++i) rk[sa[i]]=i;
for(int i=1;i<=n;++i){
if(rk[i]>1){
if(k) --k;
int j=sa[rk[i]-1];
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]){
++k;
}
height[rk[i]]=k;
}
}
}