#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<map>usingnamespace std;inlineintgi(){registerint data =0, w =1;registerchar ch =0;while(!isdigit(ch)&& ch !='-') ch =getchar();if(ch =='-') w =-1, ch =getchar();while(isdigit(ch)) data =10* data + ch -'0', ch =getchar();return w * data;}constint MAX_N =3e4+5;char a[MAX_N];int N, lg[MAX_N], f[MAX_N], g[MAX_N];structSuffixArray{int sa[MAX_N], rnk[MAX_N], lcp[MAX_N];voidbuildSA(){#define cmp(i, j, k) (y[i] == y[j] && y[i + k] == y[j + k]) staticint x[MAX_N], y[MAX_N], bln[MAX_N];memset(sa,0,sizeof(sa));memset(rnk,0,sizeof(rnk));memset(lcp,0,sizeof(lcp));memset(x,0,sizeof(x));memset(y,0,sizeof(y));memset(bln,0,sizeof(bln));int M =122;for(int i =1; i <= N; i++) bln[x[i]= a[i]]++;for(int i =1; i <= M; i++) bln[i]+= bln[i -1];for(int i = N; i >=1; i--) sa[bln[x[i]]--]= i;for(int k =1; k <= N; k <<=1){int p =0;for(int i =0; i <= M; i++) y[i]=0;for(int i = N - k +1; i <= N; i++) y[++p]= i;for(int i =1; i <= N; i++)if(sa[i]> k) y[++p]= sa[i]- k;for(int i =0; i <= M; i++) bln[i]=0;for(int i =1; i <= N; i++) bln[x[y[i]]]++;for(int i =1; i <= M; i++) bln[i]+= bln[i -1];for(int i = N; i >=1; i--) sa[bln[x[y[i]]]--]= y[i];swap(x, y); x[sa[1]]= p =1;for(int i =2; i <= N; i++) x[sa[i]]=cmp(sa[i], sa[i -1], k)? p :++p;if(p >= N)break;
M = p;}for(int i =1; i <= N; i++) rnk[sa[i]]= i;for(int i =1, j =0; i <= N; i++){if(j) j--;while(a[i + j]== a[sa[rnk[i]-1]+ j])++j;
lcp[rnk[i]]= j;}}int st[16][MAX_N];voidbuildST(){memset(st,63,sizeof(st));for(int i =1; i <= N; i++) st[0][i]= lcp[i];for(int i =1; i <=15; i++)for(int j =1; j <= N; j++)
st[i][j]=min(st[i -1][j], st[i -1][j +(1<<(i -1))]);}intquery(int l,int r){int _l = l, _r = r;
l =min(rnk[_l], rnk[_r])+1, r =max(rnk[_l], rnk[_r]);int t = lg[r - l +1];returnmin(st[t][l], st[t][r -(1<< t)+1]);}} A, B;voidSol(){scanf("%s", a +1); N =strlen(a +1);
A.buildSA(), A.buildST();reverse(&a[1],&a[N +1]);
B.buildSA(), B.buildST();memset(f,0,sizeof(f));memset(g,0,sizeof(g));for(int Len =1; Len <= N /2; Len++){for(int i = Len, j = i + Len; j <= N; i += Len, j += Len){int Lcp =min(A.query(i, j), Len), Lcs =min(B.query(N - i +2, N - j +2), Len -1);int t = Lcp + Lcs - Len +1;if(Lcp + Lcs >= Len){
g[i - Lcs]++, g[i - Lcs + t]--;
f[j + Lcp - t]++, f[j + Lcp]--;}}}for(int i =1; i <= N; i++) f[i]+= f[i -1], g[i]+= g[i -1];longlong ans =0;for(int i =1; i < N; i++) ans +=1ll* f[i]* g[i +1];printf("%lld\n", ans);}intmain(){#ifndef ONLINE_JUDGE freopen("cpp.in","r",stdin);#endiffor(int i =2; i <=30000; i++) lg[i]= lg[i >>1]+1;int T;scanf("%d",&T);while(T--)Sol();return0;}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录