3238: [Ahoi2013]差异

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 3443  Solved: 1562
[Submit][Status][Discuss]

Description

Input

一行,一个字符串S

Output

一行,一个整数,表示所求值

Sample Input

cacao

Sample Output

54

后缀数组height数组有个很好的性质:

Lcp(i, j) = min(height[k], k∈[i+1, j] )

这样在算∑lcp(i, j)时,就可以用单调栈计算每个最小值的贡献了

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct
{int l;int r;
}Point;
Point s[500010];
char str[500010];
int q, n, st[500010], a[500010], Rank[500010], Temp[500010], cot[500050], Sa[500010], height[500010];
int main(void)
{LL ans;int i, m, p, k, top;scanf("%s", str+1);n = strlen(str+1);for(i=1;i<=n;i++)a[i] = str[i];m = 128;for(i=1;i<=n;i++){Rank[i] = a[i];cot[a[i]]++;}for(i=1;i<=m;i++)cot[i] += cot[i-1];for(i=n;i>=1;i--)Sa[cot[a[i]]--] = i;for(k=1;k<=n;k*=2){p = 0;for(i=n-k+1;i<=n;i++)Temp[++p] = i;for(i=1;i<=n;i++){if(Sa[i]>k)Temp[++p] = Sa[i]-k;}memset(cot, 0, sizeof(cot));for(i=1;i<=n;i++)cot[Rank[i]]++;for(i=1;i<=m;i++)cot[i] += cot[i-1];for(i=n;i>=1;i--)Sa[cot[Rank[Temp[i]]]--] = Temp[i];swap(Rank, Temp);p = 1;Rank[Sa[1]] = 1;for(i=2;i<=n;i++){if(Temp[Sa[i-1]]==Temp[Sa[i]] && Temp[Sa[i-1]+k]==Temp[Sa[i]+k])Rank[Sa[i]] = p;elseRank[Sa[i]] = ++p;}m = p;}k = 0;for(i=1;i<=n;i++){k = max(k-1, 0);m = Sa[Rank[i]-1];while(a[i+k]==a[m+k])k++;height[Rank[i]] = k;}ans = 0;for(i=n;i>=1;i--)ans += (LL)i*(n-1);top = 0;for(i=1;i<=n;i++){while(top>=1 && height[st[top]]>=height[i]){s[st[top]].r = i-1;top--;}s[i].l = st[top];st[++top] = i;}while(top){s[st[top]].r = n;top--;}for(i=1;i<=n;i++)ans -= (LL)2*(s[i].r-i+1)*(i-s[i].l)*height[i];printf("%lld\n", ans);return 0;
}
/*
aaaaaa
*/

bzoj 3238: [Ahoi2013]差异(后缀数组+单调栈)相关推荐

  1. BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]

    3238: [Ahoi2013]差异 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2326  Solved: 1054 [Submit][Stat ...

  2. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  3. [BZOJ3238][AHOI2013]差异 [后缀数组+单调栈]

    题目地址 - GO-> 题目大意: 给定一个长度为 nn 的字符串SS,令TiTi表示它从第ii个字符开始的后缀,求以下这个式子的值: ∑1≤i<j≤nlen(Ti)+len(Tj)−2× ...

  4. [BZOJ 3238] [AHOI 2013] 差异 【后缀数组 + 单调栈】

    题目链接:BZOJ - 3238 题目分析 显然,这道题就是求任意两个后缀之间的LCP的和,这与后缀数组的联系十分明显. 求出后缀数组后,求出字典序相邻两个后缀的LCP,即 Height 数组. 那么 ...

  5. [bzoj3238]差异(后缀数组+单调栈)

    显然我们可以先把len(Ti)+len(Tj)的值先算出来,再把LCP减去.所有len(Ti)+len(Tj)的值为n*(n-1)*(n+1)/2,这个随便在纸上画一画就可以算出来的. 接下来问题就是 ...

  6. 【BZOJ3238】差异,后缀数组+单调栈维护height

    Time:2016.05.23 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 题意已经说的很明白了. 关键在于如何快速求得各lcp的和 有一个重要的性质 排名为i和j(i<j ...

  7. BZOJ3879: SvT【后缀数组+单调栈】

    Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...

  8. POJ - 3415 Common Substrings(后缀数组+单调栈)

    题目链接:点击查看 题目大意:给出两个字符串,再给出一个k,问两个字符串中长度大于等于k的公共子串有多少个(种类可重复) 题目分析:因为涉及到了子串问题,先用后缀数组跑出height数组来,接下来如果 ...

  9. 【BZOJ3879】SvT,后缀数组+单调栈维护sum

    Time:2016.08.15 Author:xiaoyimi 转载注明出处谢谢 如果有不明白的地方可以在下面评论问我 传送门 思路: 建立后缀数组求出Height 如果说对每次询问暴力求LCP累加的 ...

最新文章

  1. 关于《设计模式》这本书(三)——Proxy模式
  2. 【Python入门】Python之shutil模块11个常用函数详解
  3. python 保存网页到印象笔记_如何将网页内容保存到印象笔记?
  4. python pip修改安装镜像源
  5. elementui from表单提交_elementui upload与form一起提交
  6. php bind_param,php – 在mysqli bind_param中绑定动态变量
  7. mysql select符合查询_MySQL SELECT 联合查询
  8. kibana数据导入导出_MySQL数据库批量导出和导入查询数据
  9. 前些年上班的时候基本天天加班
  10. MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令
  11. cin.ignore()函数的使用
  12. C语言课程设计:学生管理系统
  13. CAD图纸转换成高质量的彩色PDF格式如何操作?
  14. 关闭appleid双重认证_Apple ID 被停用如何解决?
  15. 微博视频怎么下载?微博视频下载和保存工具
  16. 硬件保护和软件保护_什么是硬件保护?
  17. 全年精彩内容大盘点 | 虎年贺岁特辑
  18. css案例,注册页面_基础案例
  19. Hadoop 新手填坑指南
  20. 免费在线转换,CAD转换成PDF

热门文章

  1. python工资高还是java-Python和Java哪个工资高
  2. 学python需要什么基础-要学 Python 需要怎样的基础?
  3. python语言-Python语言介绍
  4. 深度学习的应用:语音识别、图像理解、自然语言处理
  5. 横向对比5大开源语音识别工具包,CMU Sphinx最佳
  6. 语音识别遇到的困难 - 浅谈语音识别技术的发展趋势与应用前景
  7. html网页字段序号的样式,[网页设计]局部自定义li序号CSS样式的方法
  8. android从本地服务器新浪云,GitHub - SinaCloudStorage/SinaStorage-SDK-Android: Android SDK For 新浪云存储...
  9. oracle odbc驱动 linux,linux下oracle的odbc驱动的安装与配置
  10. c语言实现md5比java难_浅谈md5弱类型比较和强碰撞