差异 bzoj-3238 Ahoi-2013

题目大意:求任意两个后缀之间的$LCP$的和。

注释:$1\le length \le 5\cdot 10^5$。


想法

两个后缀之间的$LCP$和显然不好求。

我们先构建后缀数组。

那么任意两个后缀之间的$LCP$之和就是所有$sa$数组上所有区间的$ht$最小值。

换言之,我们有一个$a$数组。

显然让你求所有区间的权值和。

一个区间的权值为这个区间内所有$a_i$的最小值。

这个过程我们可以用单调栈实现。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 500010
using namespace std; typedef long long ll;
int wv[N],wa[N],wb[N],Ws[N],x[N],y[N],sa[N],rk[N],ht[N],n,m,S[N],top;
ll f[N]; int r[N]; char s[N];
void build_sa()
{
m=129;
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) Ws[i]=0;
for(i=0;i<n;i++) Ws[x[i]=r[i]]++;
for(i=1;i<m;i++) Ws[i]+=Ws[i-1];
for(i=n-1;~i;i--) sa[--Ws[x[i]]]=i;
for(p=j=1;p<n;j<<=1,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]-j>=0) y[p++]=sa[i]-j;
for(i=0;i<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) Ws[i]=0;
for(i=0;i<n;i++) Ws[wv[i]]++;
for(i=1;i<m;i++) Ws[i]+=Ws[i-1];
for(i=n-1;~i;i--) sa[--Ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,i=p=1,x[sa[0]]=0;i<n;i++)
{
if(y[sa[i]]==y[sa[i-1]]&&y[sa[i-1]+j]==y[sa[i]+j]) x[sa[i]]=p-1;
else x[sa[i]]=p++;
}
}
for(i=1;i<n;i++) rk[sa[i]]=i;
for(i=p=0;i<n-1;ht[rk[i++]]=p)
for(p?p--:0,j=sa[rk[i]-1];r[i+p]==r[j+p];p++);
}
int main()
{
scanf("%s",s);
n=strlen(s);
ll sum=1ll*n*(n+1)*(n-1)/2;
for(int i=0;i<n;i++) r[i]=s[i];
r[n++]=0;
build_sa();
for(int i=0;i<n;i++)
{
while(top&&ht[i]<ht[S[top]]) top--;
int j=S[top];
f[i]=f[j]+1ll*(i-j)*ht[i]; sum-=2*f[i];
S[++top]=i;
}
printf("%lld\n",sum);
return 0;
}

小结:后缀数组的应用大部分都是建立在$ht$数组上的。

最新文章

  1. python---tuple元祖
  2. javascript继承(四)—prototype属性介绍
  3. 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]
  4. iOS 推荐一个下载用的第三方库
  5. BestCoder17 1001.Chessboard(hdu 5100) 解题报告
  6. 解决 PermGen space Tomcat内存设置
  7. magento 切换数据库,使用不同数据库
  8. shell脚本实例-游戏脚本
  9. 使用开关、分段控件和web视图
  10. javascript 中$符号是代表什么意思!
  11. qq邮箱发送
  12. word wrap 解惑
  13. Hidden Password
  14. webApi项目中的问题
  15. JSP学习笔记 - 源码 -- JSP Custom Tags -- JSP自定义标记
  16. quick-cocos2d-x游戏开发【6】——制作您自己的自定义效果button菜单
  17. B. Duff in Love
  18. codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)
  19. 原创《分享(Angular 和 Vue)按需加载的项目实践优化方案》
  20. react插件包

热门文章

  1. Java BigDecimal类的使用和注意事项
  2. VUE 入坑系列 一 事件
  3. .net 操作xml --移除注释节点
  4. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数
  5. Oracle使用plsql连不上本地数据库,cmd中使用sqlplus连的上的可能解决方案
  6. mysql 使用ip地址连接不上;MySQL 可以用localhost 连接,但不能用IP连接的问题,局域网192.168.*.* 无法连接mysql
  7. 第3节 mapreduce高级:7、自定义outputformat实现输出到不同的文件夹下面
  8. Spring Boot . 3 -- Spring Boot Auto_configuration 是如何实现的?
  9. MySQL与MyBatis中的查询记录
  10. nginx配置location项的URL匹配规则