题面
会打哈希就够了,想正解就走远了
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int N=200200;
int T,n;
int son[N][26],pre[N],dep[N],cnt=1,last=1;
int tim[N],times,fa[N][18];
int head[N],to[N],nex[N],cur;
int w[N];
int st[N],ed[N];
char cc[N];
void add(int u,int v)
{
to[++cur]=v;
nex[cur]=head[u];
head[u]=cur;
}
void dfs(int x)
{
tim[x]=++times;
for(int h=head[x];h;h=nex[h])
dfs(to[h]);
}
int lca(int x,int y)
{
if(x==y)
return x;
if(tim[x]>tim[y])
swap(x,y);
for(int j=17;j>=0;j--)
if(tim[fa[y][j]]>tim[x])
y=fa[y][j];
return fa[y][0];
}
void Insert(int x,int pos)
{
dep[++cnt]=dep[last]+1;
int np=cnt,p=last;
last=cnt;
w[pos]=np;
for(;!son[p][x];p=pre[p])
son[p][x]=np;
if(!p)
pre[np]=1;
else
{
int q=son[p][x];
if(dep[q]==dep[p]+1)
pre[np]=q;
else
{
dep[++cnt]=dep[p]+1;
int nq=cnt;
pre[nq]=pre[q];
pre[q]=pre[np]=nq;
mmcp(son[nq],son[q]);
for(;son[p][x]==q;p=pre[p])
son[p][x]=nq;
}
}
}
int main()
{
cin>>T;
while(T--)
{
times=cur=cnt=last=1;
mmst(head,0);
mmst(st,0);
mmst(ed,0);
for(int i=0;i<N;i++)
for(int j=0;j<26;j++)
son[i][j]=0;
scanf("%s",cc+1);
n=strlen(cc+1);
for(int i=1;i<=n;i++)
Insert(cc[i]-'a',i);
last=1;
for(int i=n;i>=1;i--)
Insert(cc[i]-'a',i+n);
for(int i=2;i<=cnt;i++)
add(pre[i],i);
dfs(1);
fa[1][0]=1;
for(int i=2;i<=cnt;i++)
fa[i][0]=pre[i];
for(int j=1;j<=17;j++)
for(int i=1;i<=cnt;i++)
fa[i][j]=fa[fa[i][j-1]][j-1];
for(int l=1;l+l<=n;l++)
for(int i=l,j=i+l;j<=n;i+=l,j+=l)
{
int x=min(l,dep[lca(w[i+n],w[j+n])]);
int y=min(l-1,dep[lca(w[i-1],w[j-1])]);
int t=x+y-l+1;
if(x+y>=l)
{
st[i-y]++;
st[i-y+t]--;
ed[j+x-t]++;
ed[j+x]--;
}
}
for(int i=1;i<=n;i++)
st[i]+=st[i-1],ed[i]+=ed[i-1];
LL ans=0;
for(int i=1;i<=n;i++)
ans+=(LL)ed[i]*st[i+1];
cout<<ans<<endl;
}
return 0;
}