DC3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1e6+7;
struct suffix_array{
int str[M],sa[M],rank[M],t1[M],t2[M],c[M];
//int lg2[M];int rmq[21][M],height[M];
//sa[i],排名i(1-n)后缀的起始下标(0 - n-1)
//rank[i],下标i(0 - n-1)后缀的排名(1 - n)
bool cmp(int *r,int a,int b,int l){
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void gao(int n,int m){
str[n]=0;
n++; int i, j, p, *x = t1, *y = t2;
for(i=0;i<m;++i) c[i]=0;
for(i=0;i<n;++i) c[x[i]=str[i]]++;
for(i=1;i<m;++i) c[i]+=c[i-1];
for(i=n-1;i>=0;--i) sa[--c[x[i]]]=i;
for(j=1;j<n;j<<=1){
p=0;
for(i=n-j;i<n;++i) y[p++]=i;
for(i=0;i<n;++i) if(sa[i