int n;
int a[maxn];
int sum[maxn],rk[maxn],r1[maxn],r2[maxn],sa1[maxn],sa2[maxn],height[maxn];
void solve()
{ forup(i,1,n) sum[a[i]]++;
forup(i,1,26) sum[i]+=sum[i-1];
forup(i,1,n) rk[i]=sum[a[i]-1]+1;
int k=1;
while(k<n)
{ forup(i,1,n)
{r1[i]=rk[i];
if(i+k<=n) r2[i]=rk[i+k];
else r2[i]=0;
}
memset(sum,0,sizeof(sum));
forup(i,1,n) sum[r2[i]]++;
forup(i,1,n) sum[i]+=sum[i-1];
fordown(i,n,1) sa2[sum[r2[i]]]=i,sum[r2[i]]--;
memset(sum,0,sizeof(sum));
forup(i,1,n) sum[r1[i]]++;
forup(i,1,n) sum[i]+=sum[i-1];
fordown(i,n,1) sa1[sum[r1[sa2[i]]]]=sa2[i],sum[r1[sa2[i]]]--;
rk[sa1[1]]=1;
forup(i,2,n)
{rk[sa1[i]]=rk[sa1[i-1]];
if(!(r1[sa1[i]]==r1[sa1[i-1]]&&r2[sa1[i]]==r2[sa1[i-1]])) rk[sa1[i]]++;
}
k=k<<1;
}
height[1]=0;int l=0;
forup(i,1,n)//其实感觉最后直接用rank的顺序来搞亦可以,但是好像并没有人这么写那就算了。。。
{ if(rk[i]>1)
{ int k=sa1[rk[i]-1];
while(i+l<=n&&k+l<=n&&a[i+l]==a[k+l]) l++;
height[rk[i]]=l;
if(l>0) l--;
}
}
}
int a[maxn];
int sum[maxn],rk[maxn],r1[maxn],r2[maxn],sa1[maxn],sa2[maxn],height[maxn];
void solve()
{ forup(i,1,n) sum[a[i]]++;
forup(i,1,26) sum[i]+=sum[i-1];
forup(i,1,n) rk[i]=sum[a[i]-1]+1;
int k=1;
while(k<n)
{ forup(i,1,n)
{r1[i]=rk[i];
if(i+k<=n) r2[i]=rk[i+k];
else r2[i]=0;
}
memset(sum,0,sizeof(sum));
forup(i,1,n) sum[r2[i]]++;
forup(i,1,n) sum[i]+=sum[i-1];
fordown(i,n,1) sa2[sum[r2[i]]]=i,sum[r2[i]]--;
memset(sum,0,sizeof(sum));
forup(i,1,n) sum[r1[i]]++;
forup(i,1,n) sum[i]+=sum[i-1];
fordown(i,n,1) sa1[sum[r1[sa2[i]]]]=sa2[i],sum[r1[sa2[i]]]--;
rk[sa1[1]]=1;
forup(i,2,n)
{rk[sa1[i]]=rk[sa1[i-1]];
if(!(r1[sa1[i]]==r1[sa1[i-1]]&&r2[sa1[i]]==r2[sa1[i-1]])) rk[sa1[i]]++;
}
k=k<<1;
}
height[1]=0;int l=0;
forup(i,1,n)//其实感觉最后直接用rank的顺序来搞亦可以,但是好像并没有人这么写那就算了。。。
{ if(rk[i]>1)
{ int k=sa1[rk[i]-1];
while(i+l<=n&&k+l<=n&&a[i+l]==a[k+l]) l++;
height[rk[i]]=l;
if(l>0) l--;
}
}
}