// SuffixArray
void InitSa(char tex[],int sa[]){
const int len=strlen(tex);
int code[len],amt[ABSIZE];
int subsa[len],cardn;
for(int i=0;i<len;i++)
{ code[i]=tex[i]-'a'; amt[code[i]]++; }
for(int i=1;i<len;i++)
{ amt[i]+=amt[i-1]; }
for(int i=len-1;i>=0;i--)
{ sa[--amt[i]]=i; }
for(int k=1,cardn=ABSIZE;k<n;k<<=1){
for(int i=n-k;i<n;i++)
{subsa[i-(n-k)+1]=i;}
for(int i=0,j=k;i<len;i++)
{if(sa[i]>=k) subsa[i+j]=sa[i]-k;}
memset(amt,0,sizeof(amt));
for(int i=0;i<len;i++)
{ amt[code[i]]++; }
for(int i=1;i<cardn;i++) amt[i]+=amt[i-1];
for(int i=len-1;i>=0;i--)
{ sa[--amt[code[subsa[i]]]]=subsa[i]; }
cardn=0; int tcode[ABSIZE]={0};
for(int i=1;i<len;i++){
tcode[sa[i]]=code[sa[i-1]]==code[sa[i]]
&& code[subsa[i-1]]==code[subsa[i]]?cardn:++cardn;
memcpy(code,tcode,len*sizeof(int)); cardn++;
if(cardn>=len) break;
}
}
}