[bzoj3238][Ahoi2013]差异_后缀数组_单调栈
2024-08-30 19:05:52
差异 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$数组上的。
最新文章
- python---tuple元祖
- javascript继承(四)—prototype属性介绍
- 56. 2种方法判断二叉树是不是平衡二叉树[is balanced tree]
- iOS 推荐一个下载用的第三方库
- BestCoder17 1001.Chessboard(hdu 5100) 解题报告
- 解决 PermGen space Tomcat内存设置
- magento 切换数据库,使用不同数据库
- shell脚本实例-游戏脚本
- 使用开关、分段控件和web视图
- javascript 中$符号是代表什么意思!
- qq邮箱发送
- word wrap 解惑
- Hidden Password
- webApi项目中的问题
- JSP学习笔记 - 源码 -- JSP Custom Tags -- JSP自定义标记
- quick-cocos2d-x游戏开发【6】——制作您自己的自定义效果button菜单
- B. Duff in Love
- codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)
- 原创《分享(Angular 和 Vue)按需加载的项目实践优化方案》
- react插件包
热门文章
- Java BigDecimal类的使用和注意事项
- VUE 入坑系列 一 事件
- .net 操作xml --移除注释节点
- t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数
- Oracle使用plsql连不上本地数据库,cmd中使用sqlplus连的上的可能解决方案
- mysql 使用ip地址连接不上;MySQL 可以用localhost 连接,但不能用IP连接的问题,局域网192.168.*.* 无法连接mysql
- 第3节 mapreduce高级:7、自定义outputformat实现输出到不同的文件夹下面
- Spring Boot . 3 -- Spring Boot Auto_configuration 是如何实现的?
- MySQL与MyBatis中的查询记录
- nginx配置location项的URL匹配规则