SA-题目
SA的题目
差异:https://lydsy.com/JudgeOnline/problem.php?id=3238
题意概述:给定一个长度为 $n$ 的字符串 $S$,令 $T_ i$ 表示它从第 $i$ 个字符开始的后缀。$2<=N<=50000$。求$$\sum_{1<=i<j<=n}len(T_i)+len(T_j)-2 \times lcp(T_i,T_j)$$
通过观察可以发现,每个后缀的长度被计算的次数是 $n-1$ ,而所有后缀长度的和是一个等差数列,$\frac{n\times(n+1)}{2}$,所以式子的前半部分就是 $\frac{(n^3-n)}{2}$ 。
现在来求后半部分,等价于所有后缀对的 $lcp$ 之和再乘二,看到后缀,我就想到 $SA$,看到 $lcp$ ,我就想到求 $height$ 数组,求出 $height$ 数组,原问题就转化为整个序列中(每个区间的最小值)之和。
这个问题可以用单调栈扫两遍,找到每个点可以作为最小值的左右端点,并注意一下边界情况,有相同最小值的时候不要算重复就可以通过了。
对于这种问题还有另一个很不错的方法:烜式合并;这是烜神仙的 $blog$ :https://www.cnblogs.com/asuldb/p/10205640.html
# include <cstdio>
# include <iostream>
# include <cstring>
# include <string>
# define R register int
# define ll long long
using namespace std;
const int maxn=;
char c[maxn];
int n,sa[maxn],ht[maxn],ta[maxn],tb[maxn],A[maxn],B[maxn],rk[maxn],m,l[maxn],r[maxn],Tp,k[maxn],v[maxn];
ll ans,anss;
inline void build_SA()
{
for (R i=;i<=n;++i) ta[ c[i] ]++;
for (R i=;i<=;++i) ta[i]+=ta[i-];
for (R i=n;i>=;--i) sa[ ta[ c[i] ]-- ]=i;
rk[ sa[] ]=;
for (R i=;i<=n;++i) rk[ sa[i] ]=(c[ sa[i] ]==c[ sa[i-] ])?rk[ sa[i-] ]:rk[ sa[i-] ]+;
for (R l=;rk[ sa[n] ]<n;l<<=)
{
for (R i=;i<=n;++i) ta[i]=tb[i]=;
for (R i=;i<=n;++i)
{
ta[ A[i]=rk[i] ]++;
tb[ B[i]=(i+l<=n)?rk[i+l]: ]++;
}
for (R i=;i<=n;++i) ta[i]+=ta[i-],tb[i]+=tb[i-];
for (R i=n;i>=;--i) rk[ tb[ B[i] ]-- ]=i;
for (R i=n;i>=;--i) sa[ ta[ A[ rk[i] ] ]-- ]=rk[i];
rk[ sa[] ]=;
for (R i=;i<=n;++i)
{
rk[ sa[i] ]=rk[ sa[i-] ];
if(A[ sa[i] ]!=A[ sa[i-] ]||B[ sa[i] ]!=B[ sa[i-] ]) rk[ sa[i] ]++;
}
}
int j=;
for (R i=;i<=n;++i)
{
if(j) j--;
while (c[ i+j ]==c[ sa[ rk[i]- ]+j ]) j++;
ht[ rk[i] ]=j;
}
}
int main()
{
scanf("%s",c+);
n=strlen(c+);
ans=1LL*n*(n+)/*(n-);
build_SA();
for (R i=;i<=n;++i)
{
while(Tp&&ht[i]<v[Tp]) r[ k[Tp] ]=i-k[Tp],Tp--;
k[++Tp]=i,v[Tp]=ht[i];
}
for (R i=;i<=Tp;++i) r[ k[i] ]=n-k[i]+;
Tp=;
for (R i=n;i>=;--i)
{
while(Tp&&ht[i]<=v[Tp]) l[ k[Tp] ]=k[Tp]-i,Tp--;
k[++Tp]=i,v[Tp]=ht[i];
}
for (R i=;i<=Tp;++i) l[ k[i] ]=k[i]-;
for (R i=;i<=n;++i) anss+=1LL*l[i]*r[i]*ht[i];
printf("%lld",ans-anss*);
return ;
}
差异
SA-题目的更多相关文章
- SA / SAM 题目集
上一次做 SA / SAM 相关的题还要数到某场毒瘤 NOIP 模拟赛--这么久没做了都快忘光了--写点东西记录一些最近做到的水好题. LOJ2059 「TJOI / HEOI2016」字符串 题意 ...
- 后缀数组 & 题目
后缀数组被称为字符串处理神器,要解决字符串问题,一定要掌握它.(我这里的下标全部都是从1开始) 首先后缀数组要处理出两个数组,一个是sa[],sa[i]表示排名第i为的后缀的起始位置是什么,rank[ ...
- NYOJ题目97兄弟郊游问题
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAr8AAAHxCAIAAADrwUM4AAAgAElEQVR4nO3dLXLjytfH8f8mzLOQYC
- NYOJ题目872开会
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsoAAAKwCAIAAAAOTc6wAAAgAElEQVR4nO3dO3LcSpOG4dkEfS6Edi
- SHOI2008 题目总结
感觉还是上海人出题水平高?这套题写得心旷神怡的...总之很难就是啦 由于我实在不适应博客园这种排版和字体..所以我的文章可能会特别难看大家见谅..说不定回头开发一个支持全局LaTeX的博客也不错?23 ...
- UVA 10594-Date Flow(无向图的最小费用网络流+题目给的数据有误)
题意:给一个有N个点的无向图,要求从1向N传送一定的数据,每条边的容量是一定的,如果能做到,输出最小的费用,否则输出Impossible. 解析:由于是无向图,所以每个有连接的两个点要建4条边,分别是 ...
- AWS 认证攻略(SA)
很高兴经过一个多月的努力顺利pass了自己的SA认证,同事说证都是虚的,不过考个证也算是对自己实力的认可吧,博主第一次写博文,先简单的写一些认证的攻略吧 1.博主11月正式入职云服务提供商,领导要求每 ...
- bzoj3796(后缀数组)(SA四连)
bzoj3796Mushroom追妹纸 题目描述 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从 ...
- Annihilate(SA)
题目描述 黑暗之主的蜈蚣几乎可以毁灭一切,因此小正方形陷入了苦战…… 小正方形现在需要减弱黑暗之主的攻击. 一个黑暗之主的攻击可以用一个仅有小写字母的字符串表示. 现在黑暗之主向小正方形发动了若干攻击 ...
- BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...
随机推荐
- mybatis教程3(映射文件)
MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% ...
- tensorflow入门指南
TensorFlow是Google公司2015年11月开源的第二代深度学习框架,是第一代框架DistBelief的改进版本. TensorFlow支持python和c/c++语言, 可以在cpu或gp ...
- stark组件之多级过滤
一.引子 在我们浏览很多页面时,会发现一般情况下都有一个分类的功能,而且还是多个类别同时控制,这就是多级过滤.如下图: 一行代表一个类别,第一行就是展示了所有的出版社,选中后就会以出版社分类,第二行就 ...
- [转]使用docker-compose 大杀器来部署服务 上
本文转自:https://www.cnblogs.com/neptunemoon/p/6512121.html 使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker ...
- jsonp请求
发起一个jsonp请求 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...
- H指数
H指数是用来综合衡量学者发表论文的数量和质量的指标,若某学者共发表N篇论文,H指数是指存在h 篇论文至少每篇有h 引用量,剩下的N-h篇中,每篇都不超过h引用量 计算H指数的方法:1.排序法思路:先将 ...
- failed to install tomcat6 service ,check your setting and permissions
出现的问题: 刚刚重新装了tomcat7,出现提示:Tomcat安装不成功.提示是:failed to install tomcat6 service ,check your setting and ...
- 安装Java语言的jdk,配置java环境变量
一.windows 安装jdk win7 下载jdk: 地址 https://www.oracle.com/technetwork/java/javase/downloads/index.html ...
- jsPlumb.jsAPI阅读笔记(官方文档翻译)
jsPlumb DOCS 公司要开始做流程控制器,所以先调研下jsPlumb,下文是阅读jsPlumb提供的document所产生的归纳总结 setup 如果不使用jQuery或者类jQuery库,则 ...
- SpringMVC处理请求
HttpServletBean HttpServletBean主要参与了创建工作,并没有涉及请求的处理. FrameworkServlet FrameworkServlet的service方法里添加了 ...