1 #include<cstdio> 2 #include<cstring> 3 typedef long long LL; 4 #define MAXN 50010 5 char s[MAXN]; 6 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN]; 7 int sa[MAXN],height[MAXN],Rank[MAXN]; 8 inline bool cmp(int *r,int a,int b,int len) 9 { 10 return r[a]==r[b]&&r[a+len]==r[b+len]; 11 } 12 void SA(int n,int m) 13 { 14 int i,j,p,*x=wa,*y=wb,*t; 15 for(i=0;i<m;i++) 16 ws[i]=0; 17 for(i=0;i<n;i++) 18 ws[x[i]=s[i]]++; 19 for(i=1;i<m;i++) 20 ws[i]+=ws[i-1]; 21 for(i=n-1;i>=0;i--) 22 sa[--ws[x[i]]]=i; 23 for(j=p=1;p<n;j<<=1,m=p) 24 { 25 for(p=0,i=n-j;i<n;i++) 26 y[p++]=i; 27 for(i=0;i<n;i++) 28 { 29 if(sa[i]>=j) 30 y[p++]=sa[i]-j; 31 } 32 for(i=0;i<m;i++) 33 ws[i]=0; 34 for(i=0;i<n;i++) 35 ws[wv[i]=x[y[i]]]++; 36 for(i=1;i<m;i++) 37 ws[i]+=ws[i-1]; 38 for(i=n-1;i>=0;i--) 39 sa[--ws[wv[i]]]=y[i]; 40 for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++) 41 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 42 } 43 } 44 void Height(int n) 45 { 46 int i,j,k; 47 for(i=1;i<=n;i++) 48 Rank[sa[i]]=i; 49 for(i=k=0;i<n;height[Rank[i++]]=k) 50 for(k?k--:0,j=sa[Rank[i]-1];s[i+k]==s[j+k];k++); 51 } 52 int main() 53 { 54 int i,c,len; 55 LL ans; 56 scanf("%d",&c); 57 while(c--) 58 { 59 scanf(" %s",s); 60 len=strlen(s); 61 SA(len+1,256); 62 Height(len); 63 ans=0; 64 for(i=1;i<=len;i++) 65 ans+=len-sa[i]-height[i]; 66 printf("%lld\n",ans); 67 } 68 return 0; 69 }