自己整理模板,仅作模板保存使用
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define cin1(a) scanf("%d",&a)
#define cin2(a,b) scanf("%d%d",&a,&b)
#define cins(a) scanf("%s",a)
#define cout1(a) printf("%d\n",a)
#define ll long long
using namespace std;
const int maxn=50010;
char s[maxn];
int N,M,rak[maxn],sa[maxn],tax[maxn],tp[maxn];//N为字符串长度,M为字符集大小
int height[maxn];
void Qsort()
{
for(int i=0;i<=M;i++) tax[i]=0;
for(int i=1;i<=N;i++) tax[rak[i]]++;
for(int i=1;i<=M;i++) tax[i]+=tax[i-1];
for(int i=N;i>=1;i--) sa[tax[rak[tp[i]]]--]=tp[i];
}
void SuffixSort()
{
M=75; ///字符集大小,75是从0到小写z的范围
for(int i=1;i<=N;i++) rak[i]=s[i]-'0'+1,tp[i]=i;
Qsort();
for(int w=1,p=0;p<N;M=p,w<<=1)
{
p=0;
for(int i=1;i<=w;i++) tp[++p]=N-w+i;
for(int i=1;i<=N;i++)
{
if(sa[i]>w) tp[++p]=sa[i]-w;
}
Qsort();
swap(tp,rak);
rak[sa[1]]=p=1;
for(int i=2;i<=N;i++)
rak[sa[i]]=(tp[sa[i-1]]==tp[sa[i]]&&tp[sa[i-1]+w]==tp[sa[i]+w])?p:++p;
}
}
void getheight()
{
int j,k=0;
for(int i=1;i<=N;i++)
{
if(k) k--;
j=sa[rak[i]-1];
while(s[i+k]==s[j+k]) k++;
height[rak[i]]=k;
}
}
int main()
{
int t;
cin1(t);
getchar();
while(t--)
{
ll ans=0;
cins(s + 1);
N=strlen(s + 1);
//cout<<N<<endl;
SuffixSort();
getheight();
for(int i=1;i<=N;i++)
{
ans+=N-sa[i]+1-height[i];
}
printf("%lld\n",ans);
}
return 0;
}