求和式的前两项可以直接算,问题是对于每对i,j计算LCP。

一个比较显然的性质是,LCP(i,j)是h[rk[i]+1~rk[j]]中的最小值。

从h的每个元素角度考虑,就是对每个h计算有多少对i,j以它为最小值。

在h中使用单调栈统计左右比它小的第一个元素,相乘得到结果。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,inf=;
ll ans;
char s[N];
int n,top,x[N],y[N],c[N],sa[N],h[N],rk[N],l[N],r[N],stk[N];
int Cmp(int a,int b,int l){ return a+l<=n && b+l<=n && y[a]==y[b] && y[a+l]==y[b+l]; } void build_sa(int m){
memset(y,,sizeof(y));
rep(i,,m) c[i]=;
rep(i,,n) c[x[i]=s[i]-'a'+]++;
rep(i,,m) c[i]+=c[i-];
for (int i=n; i; i--) sa[c[x[i]]--]=i;
for (int k=,p=; p<n; k<<=,m=p){
p=;
rep(i,n-k+,n) y[++p]=i;
rep(i,,n) if (sa[i]>k) y[++p]=sa[i]-k;
rep(i,,m) c[i]=;
rep(i,,n) c[x[y[i]]]++;
rep(i,,m) c[i]+=c[i-];
for (int i=n; i; i--) sa[c[x[y[i]]]--]=y[i];
rep(i,,n) y[i]=x[i]; p=; x[sa[]]=;
rep(i,,n) x[sa[i]]=Cmp(sa[i-],sa[i],k) ? p : ++p;
}
} void get(){
int k=;
rep(i,,n) rk[sa[i]]=i;
rep(i,,n){
for (int j=sa[rk[i]-]; i+k<=n && j+k<=n && s[i+k]==s[j+k]; k++);
h[rk[i]]=k; if (k) k--;
}
} void solve(){
rep(i,,n) ans+=1ll*i*(n-);
h[]=-inf;
rep(i,,n){
while (h[i]<=h[stk[top]]) top--;
if (!stk[top]) l[i]=; else l[i]=stk[top]+;
stk[++top]=i;
}
h[n+]=-inf; top=; stk[]=n+;
for (int i=n; i; i--){
while (h[i]<h[stk[top]]) top--;
if (stk[top]==n+) r[i]=n; else r[i]=stk[top]-;
stk[++top]=i;
}
rep(i,,n) ans-=2ll*(i-l[i]+)*(r[i]-i+)*h[i];
} int main(){
freopen("bzoj3238.in","r",stdin);
freopen("bzoj3238.out","w",stdout);
scanf("%s",s+); n=strlen(s+);
build_sa(); get(); solve(); printf("%lld\n",ans);
return ;
}

最新文章

  1. [Spring框架]Spring AOP基础入门总结一.
  2. show_sync_logs
  3. 每天一个Linux命令---tcpdump
  4. Android的Drawable缓存机制源码分析
  5. 多线程包:java.util.concurrent,
  6. [转] 学习React Native必看的几个开源项目
  7. 网络流(最大流):COGS 28 [NOI2006] 最大获利
  8. MVC 5学习总结笔记1
  9. 【R与数据库】R + 数据库 = 非常完美
  10. DataGuard实战1
  11. IDL 矩阵运算
  12. 【转】搭建spark环境 单机版
  13. R︱并行计算以及提高运算效率的方式(parallel包、clusterExport函数、SupR包简介)
  14. Dynamics CRM2015 on-premises直接升级Dynamics CRM2016 on-premises
  15. 【48】java抽象类和接口的定义和区别
  16. js根据顺序加载,有依赖关系
  17. [java,2017-06-12] myEclipse双击无法打开文件
  18. C# MemoryCache GCHandle
  19. EC2(elastic compute cloud,弹性计算云,又称EC2实例)
  20. pymc

热门文章

  1. bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
  2. 【BZOJ】1299: [LLH邀请赛]巧克力棒
  3. 基于 Docker 的 Zabbix 微服务系统
  4. [Unity]多线程编程的一点心得
  5. 【洛谷 P3809】 【模板】后缀排序
  6. bzoj 1296 DP
  7. javascript中的addEventListener与attchEvent
  8. nginx 伪静态rewrite
  9. Python【模块】importlib,requests
  10. TCP之listen&amp;backlog