后缀数组
// 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; } } }